std::string vs C-string
Ну, если конкретно, то утверждение что std::string менее эффективна, чем c-string есть у Герберта Шилдта в книге "Полный справочник по C++":
[QUOTE=Герберт Шилдт]Следует заметить, что нет никаких причин отказываться от традиционных массивов символов, завершающихся нулевым байтом. Они по прежнему являются наиболее эффективным способом реализации строк. Однако, если быстродействие программы не является принципиально важным фактором, новый класс string предоставляет безопасный и чрезвычайно удобный способ работы со строками. [/QUOTE]
Тут не только гремучая смесь, но и опять этот странный диалект: в котором void main() и iostream.h т.п. Но, вроде бы, автор темы не просил оценить нестандартность кода...
[QUOTE=Green]Зачем использовать C-string (char*), а не использовать C++ std::string ?
Почему бы не использовать std::vector, вместо char** ?[/QUOTE]
Авторы учебников пишут, что использование C-string и массивов эффективнее (быстрее, меньше требуют ресурсов), чем std::string, std::vector. Однако, я больше использую последние, так как мне они кажутся удобнее и безопаснее, и мощь современных (и "вчерашних") компьютеров позволяет.
Будем считать, что это бонус от участников форума.
Авторы учебников пишут, что использование C-string и массивов эффективнее (быстрее, меньше требуют ресурсов), чем std::string, std::vector. Однако, я больше использую последние, так как мне они кажутся удобнее и безопаснее, и мощь современных (и "вчерашних") компьютеров позволяет.
"Авторы учебников" ошибаются по нескольким пунктам.
ты лучше пиши C-style string, а то я полчаса тупил, причем тут CString :)
использование std::string ничуть не менее эффективно, чем Cишных строк, если подходить разумно. есть ситуации, где вполне можно обойтись char*
Герберт Шилдт может писать все что ему хочется...Кто он вообще ?
Страуструп пишет вот что:
Сведите к минимуму использование массивов символов и строк С.Стандартные библиотеки классов С++ string u vector упрощают програмирование по сравнению с традиционным стилем С.В общем не пытайтесь делать то,что уже сделано в стандартной библиотеке...
Чем лучше вы знаете С,тем труднее вам будет избежать программирования на С++ в стиле С теряя при этом потенциальные преимущества С++...
http://en.wikipedia.org/wiki/Herbert_Schildt
http://www.herbschildt.com/abouths.htm
Это так, справка.
На самом деле, в таких спорах правда определяется расчетом, а не голосованием или выяснением, что вот это авторитет и значит правильно, а этот не с нашего района и кто он такой вообще.
У Шилдта такого рассчета я не нашел. Надеюсь, у Страуструпа такой рассчет есть. Будет время - посмотрю.
Хотя для меня этот спор практического смысла не имеет. Я и так по возможности не использую массивы символов.
Я знаю кто такой Страуструп. Я применил сравнение, чтоб показать, что ссылаться на "Отцов" в науке бессмысленно. Разве, что сказать - читай труды такого-то, там уже есть все расчеты по этой теме (не поймите опять неправильно, я не прошу ссылок на труды Страуструпа).
Kogrom, ты привел лишь выводы, которые сделал Шилдт. Выводы без основания - пустой звук.
Вопрос остается открытым: почему std::string менее эффективен, чем c-style string ?
Ответ "потому что Шилдт так считает" - не канает.
Каковы критерии эффективности?
И почему std::string менее эффективен по каждому из критериев?
Какой std::string имеется в виду (какая конкретно реализация) ?
И почему std::string менее эффективен по каждому из критериев?
Какой std::string имеется в виду (какая конкретно реализация) ?
Ишь как оно повернулось...
Я говорю о том STL, который включен в стандарт C++.
Критерий удобства и простоты не учитывается, так как в этом я не спорю. Пока вижу три спорных критерия:
1. быстродействие,
2. использование оперативной памяти,
3. размер исполнимого файла (величина машинного кода).
для компьютеров может это не важно, но для контроллеров, которые используются в разных устройствах, это может иметь значение.
Сам я пока что-то доказывать не готов, поэтому привожу ссылку на опыты других людей:
http://deepencpp.blogspot.com/2007/08/stdstring-vs-const-char-comparison.html
Вообщем - моё мнение: оба варианта безукоризненны при условии использования по назначению(забавная фраза получилась :) ).
Я говорю о том STL, который включен в стандарт C++.
Какая именно реализация?
1. быстродействие,
Ну и в чем проблема в быстродействии? На каких именно операциях? В какой именно реализации?
2. использование оперативной памяти,
Ну и в чем проблема с оперативной памятью? На каких именно операциях? В какой именно реализации?
3. размер исполнимого файла (величина машинного кода).
Ну и в чем проблема с размер исполнимого файла? При какой функциональности? В какой именно реализации?
для компьютеров может это не важно, но для контроллеров, которые используются в разных устройствах, это может иметь значение.
Для контроллеров существуют соотв. реализации STL.
Сам я пока что-то доказывать не готов, поэтому привожу ссылку на опыты других людей:
Так вот там эти люди и говорят:
Но это еще ничего не значит так как реализаций STL и стандартной библиотеки С множество и результаты на этом множестве вполне могут отличаться
Кроме того, это тестирование касается только быстродействия сравнения строк. Утверждать лишь по этому тесту о неэффективности std::string, все равно, что утверждать, что самолет менее эффективен, чем автомобиль, на основании езды змейкой.
Вообще я думаю, что и c-строки и std::string основываются на массиве символов, но у std::string функции работы со строками удобнее, а за удобство обычно приходится чем-то платить. Хотя, возможно, создатели компиляторов как-то справляются с этой проблемой.
Для себя я пока сделал вывод, что преимущества той или иной технологии зафисит от конкретного компилятора. То есть совесть меня не будет мучать за то, что я использую std::string...
Всё. Больше я в этой теме не писатель. Только читатель.
Конечно, т.к. в твоих постах нет конкретики. :)
Вообще я думаю, что и c-строки и std::string основываются на массиве символов, но у std::string функции работы со строками удобнее, а за удобство обычно приходится чем-то платить.
За удобство не всегда приходится платить.
Кстати, std::string не обязательно основывается на массиве символов, именно по этому у неё есть метод формирования C-string - c_str().
Хотя, возможно, создатели компиляторов как-то справляются с этой проблемой.
Для себя я пока сделал вывод, что преимущества той или иной технологии зафисит от конкретного компилятора. То есть совесть меня не будет мучать за то, что я использую std::string...
Только не от компилятора, а от реализации библиотеки, в данном случае STL.
char str[4] - (пример - реализация WEB сервера, запросы GET/POST/HEAD) ты тоже будешь использовать std::string? и вместо
if ( str[0] == 'P' && str[2] == 'S' && str[3] == 'T') { }
будешь использовать compare?
Обойтись без чего?
Без std::string ?
Ну можно сотни примеров привести, где обойтись можно.
А если задуматься, где можно обойтись без сотового телефона? :)
char str[4] - (пример - реализация WEB сервера, запросы GET/POST/HEAD) ты тоже будешь использовать std::string? и вместо
if ( str[0] == 'P' && str[2] == 'S' && str[3] == 'T') { }
будешь использовать compare?
Извини, но это пример из серии:
printf("Hello world!");
где здесь нужен std::string и bind1st ?
Что находится выше этого if ? Как приходит строка?
Если так:
string message;
socket_stream >> message;
То зачем мне str[4] ?
Что касается compare, то в зависимости от ситуации я могу использовать множество различных способов проверить, в т.ч. и str[0] == 'P' && str[2] == 'S' && str[3] == 'T' только для std::string.
Кстати, compare будет нагляднее.
А почему ты не проверяешь 'O' ?
Без std::string ?
Ну можно сотни примеров привести, где обойтись можно.
ну и я про то же ;-)
А почему ты не проверяешь 'O' ?
это кусок реального кода :) O проверяется выше. это не существенно в данном случае.
я к чему веду - смешивать C style и C++ style - плохо. но еще хуже - бездумно пользоваться инструментами. а почитав такой топик, любой начинающий Сппшник может ошибочно решить, что использовать std::string нужно везде и всегда, где есть работа с текстом, а инакомыслие - смертный грех :)
Ну не любой, а безголовый... :)
А таким мало что может помочь.