Класс String, выделяемый в стеке для небольших строк?

Кто-нибудь знает, существует ли класс строк, совместимый с интерфейсом STL, который выделяет память для небольших строк в стеке (до определенного порога) и кучу для более крупных строк?

Я ищу оптимизацию программы и использую выделение небольших локальных строк, которые легко помещаются в стек, вместо того, чтобы выделяться в куче.


person ROAR    schedule 24.03.2011    source источник
comment
В Visual Studio есть такая оптимизация (для очень маленькой строки, всего пара символов), в то время как gcc предпочитает Copy-On-Write.   -  person Matthieu M.    schedule 24.03.2011
comment
Мы используем Visual Studio 2010, можно ли где-нибудь прочитать об этой оптимизации (MSDN или где-нибудь еще)?   -  person ROAR    schedule 24.03.2011
comment
Большинство компиляторов сделают это, если у вас достаточно последняя версия.   -  person Bo Persson    schedule 24.03.2011
comment
Посмотрел, и в VS 2010 оказалось, что это 16 байт, нет возможности установить что-либо еще.   -  person ROAR    schedule 24.03.2011


Ответы (4)


Вы можете предоставить собственный распределитель для std::basic_string (это третий аргумент шаблона). Этот ответ объясняет, как это использовать, и ссылается на реализацию распределителя стека, которую можно использовать.

person Björn Pollex    schedule 24.03.2011
comment
Некоторая реализация std :: string делает это, это называется оптимизацией небольшой строки. Быстрый Google должен сказать вам, есть ли у вас или есть альтернатива, которую вы можете использовать. - person Pete; 24.03.2011

Реализация vstring (__versa_string) от gcc может выполнять оптимизацию небольших строк и имеет интерфейс строки std. Если вы используете gcc, достаточно просто включить ext / vstring. В противном случае вы сможете адаптировать его к вашему компилятору / среде.

person Logan Capaldo    schedule 24.03.2011

Это старинный вопрос, но я чувствую, что он лучше, чем любой из текущих ответов.

http://llvm.org/docs/ProgrammersManual.html#dss_smallstring

В основном это то, что вы хотите. Кстати, tcmalloc увеличил производительность в моей (плохо спроектированной: D) программе с интенсивным выделением строк на 10%. Также вы должны профилировать, чтобы доказать, что аллоки являются вашей проблемой производительности.

person NoSenseEtAl    schedule 17.09.2012

__versa_string Версия SSO может хранить не более 15 байтов в стеке, и если это так, она резервирует 16 байтов независимо от размера строки (http://codepad.org/2M7N9cTu).

http://www.and.org/ustr/ может повторно использовать буфер стека, но у меня были проблемы связывание с ним под Debian Wheezy 64bit.

http://freecode.com/projects/str-class может повторно использовать буфер стека.

Я написал строковый класс только для заголовка, который использует всего четыре байта и может повторно использовать буфер стека: http://code.google.com/p/libglim/source/browse/trunk/gstring.hpp
Он имеет ограниченную совместимость с STL: basic_streambuf реализован для использования с std :: ostream.

person ArtemGr    schedule 24.05.2012