Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Erik945
29 / 1 / 1
Регистрация: 30.08.2013
Сообщений: 37
#1

char* vs std::string - C++

20.12.2013, 20:03. Просмотров 1003. Ответов 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
на вод поступают 2 строки типа string. определить количество вхождений строки 2...

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

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char,...

Где и почему используют ту или иную строку std::string, char[], System::String^ ?
Где и почему используют ту или иную строку std::string, char, ...

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

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

6
alsav22
5438 / 4833 / 831
Регистрация: 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 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
20.12.2013, 20:18 #3
Цитата Сообщение от Erik945 Посмотреть сообщение
std::string как правило, более предсказуем чем строка, которая, как я понимаю, хранится в стеке а не в куче (если конечно, не загнать ее туда нарочно)
Этот пункт не имеет никакого смысла. String хранит в себе поинтер который содержит в себе адрес на область в куче... К тому же между программированием и предсказанием мало общего...
0
monolit
188 / 187 / 46
Регистрация: 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
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.12.2013, 20:42 #6
Цитата Сообщение от Erik945 Посмотреть сообщение
Вот собственно почему? исторически сложилось, по указанным мной причинам, еще почему-то?
Когда-то не было string, а стандартные функции были.
0
MrCold
859 / 757 / 174
Регистрация: 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 и/или char*
Здравствуйте. пишу метод построчной обработки данных из файла Вот он: ...

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

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

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


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

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

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