Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

std::string vs C-string

87
24 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
"Авторы учебников" ошибаются по нескольким пунктам.



Ну, если конкретно, то утверждение что std::string менее эффективна, чем c-string есть у Герберта Шилдта в книге "Полный справочник по C++":

[QUOTE=Герберт Шилдт]Следует заметить, что нет никаких причин отказываться от традиционных массивов символов, завершающихся нулевым байтом. Они по прежнему являются наиболее эффективным способом реализации строк. Однако, если быстродействие программы не является принципиально важным фактором, новый класс string предоставляет безопасный и чрезвычайно удобный способ работы со строками. [/QUOTE]

87
24 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Далее, для чего это гремучая смесь C++ и C-style?


Тут не только гремучая смесь, но и опять этот странный диалект: в котором void main() и iostream.h т.п. Но, вроде бы, автор темы не просил оценить нестандартность кода...
[QUOTE=Green]Зачем использовать C-string (char*), а не использовать C++ std::string ?
Почему бы не использовать std::vector, вместо char** ?[/QUOTE]

Авторы учебников пишут, что использование C-string и массивов эффективнее (быстрее, меньше требуют ресурсов), чем std::string, std::vector. Однако, я больше использую последние, так как мне они кажутся удобнее и безопаснее, и мощь современных (и "вчерашних") компьютеров позволяет.

3
24 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Но, вроде бы, автор темы не просил оценить нестандартность кода...


Будем считать, что это бонус от участников форума.

Цитата: Kogrom

Авторы учебников пишут, что использование C-string и массивов эффективнее (быстрее, меньше требуют ресурсов), чем std::string, std::vector. Однако, я больше использую последние, так как мне они кажутся удобнее и безопаснее, и мощь современных (и "вчерашних") компьютеров позволяет.


"Авторы учебников" ошибаются по нескольким пунктам.

2
24 марта 2008 года
squirL
5.6K / / 13.08.2003
Цитата: Kogrom
Ну, если конкретно, то утверждение что std::string менее эффективна, чем c-string есть у Герберта Шилдта в книге "Полный справочник по C++":



ты лучше пиши C-style string, а то я полчаса тупил, причем тут CString :)
использование std::string ничуть не менее эффективно, чем Cишных строк, если подходить разумно. есть ситуации, где вполне можно обойтись char*

320
24 марта 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: Kogrom
Ну, если конкретно, то утверждение что std::string менее эффективна, чем c-string есть у Герберта Шилдта в книге "Полный справочник по C++":



Герберт Шилдт может писать все что ему хочется...Кто он вообще ?
Страуструп пишет вот что:


Сведите к минимуму использование массивов символов и строк С.Стандартные библиотеки классов С++ string u vector упрощают програмирование по сравнению с традиционным стилем С.В общем не пытайтесь делать то,что уже сделано в стандартной библиотеке...
Чем лучше вы знаете С,тем труднее вам будет избежать программирования на С++ в стиле С теряя при этом потенциальные преимущества С++...

87
24 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: m_Valery
Герберт Шилдт может писать все что ему хочется...Кто он вообще ? Страуструп пишет вот что...



http://en.wikipedia.org/wiki/Herbert_Schildt
http://www.herbschildt.com/abouths.htm

Это так, справка.
На самом деле, в таких спорах правда определяется расчетом, а не голосованием или выяснением, что вот это авторитет и значит правильно, а этот не с нашего района и кто он такой вообще.

У Шилдта такого рассчета я не нашел. Надеюсь, у Страуструпа такой рассчет есть. Будет время - посмотрю.

Хотя для меня этот спор практического смысла не имеет. Я и так по возможности не использую массивы символов.

320
24 марта 2008 года
m_Valery
1.0K / / 08.01.2007
А с тобой никто и не спорит.Тут и так все очевидно.Страуструп - не авторитет и не из "нашего района",Страуструп - создатель языка С++,Отец.
87
24 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: m_Valery
Страуструп - не авторитет и не из "нашего района",Страуструп - создатель языка С++,Отец.



Я знаю кто такой Страуструп. Я применил сравнение, чтоб показать, что ссылаться на "Отцов" в науке бессмысленно. Разве, что сказать - читай труды такого-то, там уже есть все расчеты по этой теме (не поймите опять неправильно, я не прошу ссылок на труды Страуструпа).

3
24 марта 2008 года
Green
4.8K / / 20.01.2000
Давайте папами меряться не будем, а просто попробуем рассуждать логически.
Kogrom, ты привел лишь выводы, которые сделал Шилдт. Выводы без основания - пустой звук.
Вопрос остается открытым: почему std::string менее эффективен, чем c-style string ?
Ответ "потому что Шилдт так считает" - не канает.
Каковы критерии эффективности?
И почему std::string менее эффективен по каждому из критериев?
Какой std::string имеется в виду (какая конкретно реализация) ?
87
24 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Каковы критерии эффективности?
И почему std::string менее эффективен по каждому из критериев?
Какой std::string имеется в виду (какая конкретно реализация) ?


Ишь как оно повернулось...

Я говорю о том STL, который включен в стандарт C++.
Критерий удобства и простоты не учитывается, так как в этом я не спорю. Пока вижу три спорных критерия:

1. быстродействие,
2. использование оперативной памяти,
3. размер исполнимого файла (величина машинного кода).
для компьютеров может это не важно, но для контроллеров, которые используются в разных устройствах, это может иметь значение.

Сам я пока что-то доказывать не готов, поэтому привожу ссылку на опыты других людей:

http://deepencpp.blogspot.com/2007/08/stdstring-vs-const-char-comparison.html

9.3K
24 марта 2008 года
iridum
175 / / 26.08.2007
Кто сказал что надо использовать только самое последнее и новое? Эфективность ? Эффективность это когда используется очень хорошо любой стиль будь то С будь то С++ когда программа делается быстрее и качественнее. Мне вообще удобнее AnsiString, потому что он тесно всязан с Builder, но без С стиля в некоторых случаях обходится неполучается, к тому же это массив данных, а не класс.
Вообщем - моё мнение: оба варианта безукоризненны при условии использования по назначению(забавная фраза получилась :) ).
3
25 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom

Я говорю о том STL, который включен в стандарт C++.


Какая именно реализация?

Цитата: Kogrom

1. быстродействие,


Ну и в чем проблема в быстродействии? На каких именно операциях? В какой именно реализации?

Цитата: Kogrom

2. использование оперативной памяти,


Ну и в чем проблема с оперативной памятью? На каких именно операциях? В какой именно реализации?

Цитата: Kogrom

3. размер исполнимого файла (величина машинного кода).


Ну и в чем проблема с размер исполнимого файла? При какой функциональности? В какой именно реализации?

Цитата: Kogrom

для компьютеров может это не важно, но для контроллеров, которые используются в разных устройствах, это может иметь значение.


Для контроллеров существуют соотв. реализации STL.


Цитата: Kogrom

Сам я пока что-то доказывать не готов, поэтому привожу ссылку на опыты других людей:


Так вот там эти люди и говорят:

Цитата:

Но это еще ничего не значит так как реализаций STL и стандартной библиотеки С множество и результаты на этом множестве вполне могут отличаться


Кроме того, это тестирование касается только быстродействия сравнения строк. Утверждать лишь по этому тесту о неэффективности std::string, все равно, что утверждать, что самолет менее эффективен, чем автомобиль, на основании езды змейкой.

87
25 марта 2008 года
Kogrom
2.7K / / 02.02.2008
Green, в вашем ответе одни вопросы...

Вообще я думаю, что и c-строки и std::string основываются на массиве символов, но у std::string функции работы со строками удобнее, а за удобство обычно приходится чем-то платить. Хотя, возможно, создатели компиляторов как-то справляются с этой проблемой.

Для себя я пока сделал вывод, что преимущества той или иной технологии зафисит от конкретного компилятора. То есть совесть меня не будет мучать за то, что я использую std::string...

Всё. Больше я в этой теме не писатель. Только читатель.
3
25 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Green, в вашем ответе одни вопросы...


Конечно, т.к. в твоих постах нет конкретики. :)

Цитата: Kogrom

Вообще я думаю, что и c-строки и std::string основываются на массиве символов, но у std::string функции работы со строками удобнее, а за удобство обычно приходится чем-то платить.


За удобство не всегда приходится платить.
Кстати, std::string не обязательно основывается на массиве символов, именно по этому у неё есть метод формирования C-string - c_str().

Цитата: Kogrom

Хотя, возможно, создатели компиляторов как-то справляются с этой проблемой.
Для себя я пока сделал вывод, что преимущества той или иной технологии зафисит от конкретного компилятора. То есть совесть меня не будет мучать за то, что я использую std::string...


Только не от компилятора, а от реализации библиотеки, в данном случае STL.

2
25 марта 2008 года
squirL
5.6K / / 13.08.2003
Green, вот только честно, где можно со 100% гарантией обойтись
char str[4] - (пример - реализация WEB сервера, запросы GET/POST/HEAD) ты тоже будешь использовать std::string? и вместо
if ( str[0] == 'P' && str[2] == 'S' && str[3] == 'T') { }
будешь использовать compare?
3
25 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: squirL
Green, вот только честно, где можно со 100% гарантией обойтись


Обойтись без чего?
Без std::string ?
Ну можно сотни примеров привести, где обойтись можно.
А если задуматься, где можно обойтись без сотового телефона? :)

Цитата: squirL

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' ?

2
25 марта 2008 года
squirL
5.6K / / 13.08.2003
Цитата: Green
Обойтись без чего?
Без std::string ?
Ну можно сотни примеров привести, где обойтись можно.


ну и я про то же ;-)

Цитата:

А почему ты не проверяешь 'O' ?


это кусок реального кода :) O проверяется выше. это не существенно в данном случае.

я к чему веду - смешивать C style и C++ style - плохо. но еще хуже - бездумно пользоваться инструментами. а почитав такой топик, любой начинающий Сппшник может ошибочно решить, что использовать std::string нужно везде и всегда, где есть работа с текстом, а инакомыслие - смертный грех :)

3
25 марта 2008 года
Green
4.8K / / 20.01.2000
Цитата: squirL
а почитав такой топик, любой начинающий Сппшник может ошибочно решить, что использовать std::string нужно везде и всегда, где есть работа с текстом, а инакомыслие - смертный грех :)


Ну не любой, а безголовый... :)
А таким мало что может помочь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог