Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
#1

char* vs std::string - C++

20.12.2013, 20:03. Просмотров 914. Ответов 6
Метки нет (Все метки)

При чтении чужих сорцов, обратил внимание, что в роли аргументов для функций/методов, как правило используются указатели на массивы чаров, а не СТДшные стринги. Например:

C++
1
2
WriteToFile( const char* FileName )
WriteToFile( const std::string FileName )
Лично я увидел следующие преимущества
- экономится память за счет того что передается указатель (4 или 8 байтов), а не здоровый объект класса.
- экономия времени за счет того что не вызываются конструкторы/методы копирования
и недостатки
- std::string как правило, более предсказуем чем строка, которая, как я понимаю, хранится в стеке а не в куче (если конечно, не загнать ее туда нарочно)

Насколько я прав? Может есть еще какие-то скользкие моменты?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 20:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос char* vs std::string (C++):

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*') - C++
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...

Где и почему используют ту или иную строку std::string, char[], System::String^ ? - C++
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните пожалуйста где нужно использовать...

std::string в char* - C++
Можно ли привести std::string к указателю на нуль-терминальную строку? Как?

std::string и/или char* - C++
Здравствуйте. пишу метод построчной обработки данных из файла Вот он: bool loadFromFile(std::string fileName) { ...

6
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.12.2013, 20:16 #2
Можно так и со string делать:
C++
1
WriteToFile( const char* FileName );
В string есть метод c_str():
C++
1
2
string FileName;
WriteToFile(FileName.c_str());
Добавлено через 4 минуты
Цитата Сообщение от Erik945 Посмотреть сообщение
- экономится память за счет того что передается указатель (4 или 8 байтов), а не здоровый объект класса.
- экономия времени за счет того что не вызываются конструкторы/методы копирования
Зачем string по значению передавать? Передавайте константную ссылку.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.12.2013, 20:18 #3
Цитата Сообщение от Erik945 Посмотреть сообщение
std::string как правило, более предсказуем чем строка, которая, как я понимаю, хранится в стеке а не в куче (если конечно, не загнать ее туда нарочно)
Этот пункт не имеет никакого смысла. String хранит в себе поинтер который содержит в себе адрес на область в куче... К тому же между программированием и предсказанием мало общего...
0
monolit
188 / 187 / 22
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
20.12.2013, 20:20 #4
Первый скользкий момент:
пишут обычно не
Цитата Сообщение от Erik945 Посмотреть сообщение
WriteToFile( const std::string FileName )
а
C++
1
WriteToFile( const std::string& FileName )
Цитата Сообщение от Erik945 Посмотреть сообщение
строка, которая, как я понимаю, хранится в стеке
Ну эт если ты ее объвлял как char s[] = "qwerty", а не выделял вручную память...

Цитата Сообщение от Erik945 Посмотреть сообщение
экономится память за счет того что передается указатель (4 или 8 байтов), а не здоровый объект класса
Поэтому и передают по ссылке, как я указал, чтоб не передавать "здоровый объект класса".
Цитата Сообщение от Erik945 Посмотреть сообщение
std::string как правило, более предсказуем чем строка
А насчет чего там гадать-то?) В string'е по сути та же самая строка, только обернутая в класс для большего удобства.

А вообще стандартные функции работают с const char* в основном, и вызывать лишний раз .c_str() как то напряжно при их использовании, да и плюсов от использования string не так уж много (естественно, если эта строка не модифицируется). В общем, смотреть по ситуации нужно.

Добавлено через 1 минуту
Цитата Сообщение от xtorne21st Посмотреть сообщение
между программированием и предсказанием мало общего
Хорошо сказал!)
0
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
20.12.2013, 20:40  [ТС] #5
Это все верно, но...
Цитата Сообщение от monolit Посмотреть сообщение
А вообще стандартные функции работают с const char* в основном
Вот собственно почему? исторически сложилось, по указанным мной причинам, еще почему-то?


xtorne21st в цитатник однозначно!
0
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.12.2013, 20:42 #6
Цитата Сообщение от Erik945 Посмотреть сообщение
Вот собственно почему? исторически сложилось, по указанным мной причинам, еще почему-то?
Когда-то не было string, а стандартные функции были.
0
MrCold
858 / 756 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
20.12.2013, 20:56 #7
Цитата Сообщение от Erik945 Посмотреть сообщение
При чтении чужих сорцов, обратил внимание, что в роли аргументов для функций/методов, как правило используются указатели на массивы чаров, а не СТДшные стринги.
Ещё для межъязыкового взаимодействия.
Код C++ можно использовать в виде .DLL, например в С# или Delphi.
С# , Delphi ничего не знают о std::string.
При передаче же указателя на char
проблем не будет.
0
20.12.2013, 20:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 20:56
Привет! Вот еще темы с ответами:

Std::string в const char* - C++
можно ли std::string превратить в const char* и как это сделать?

Перевод массива char в std::string в определенном формате - C++
Имеится char a=&quot;145&quot;; нужно его превратить в std::string , но чтоб string b=&quot;&quot;; тоесть чтоб скобки добавились. ...

Преобразовать const unsigned char* в std::string (или _bstr_t ) - C++
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned char*. а мне нужно получить ...

Найти вхождение одного символа std::string в строку char* - C++
Каким образом можно найти вхождение одного символа std::string в строку char*? Наоборот то понятное дело как, но нужно именно так


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru