Как работает stringstream внутри? - PullRequest
5 голосов
/ 31 октября 2010

Я спрашиваю в контексте исполнения. Является ли stringstream просто строкой / вектором, поэтому запись в него может привести к тому, что весь его контент будет скопирован в больший кусок памяти, или это будет сделано более хитрым способом (скажем, в виде списка строк или чего-то еще)?

Ответы [ 2 ]

4 голосов
/ 31 октября 2010

27.7.3 / 1 говорит, что basic_ostringstream использует basic_stringbuf.Я думаю, что 27.7.1.3/8 говорит, что basic_stringbuf освобождает пространство путем перераспределения буфера и даже не гарантирует экспоненциальный рост (и, следовательно, амортизируемый O (1) для добавления).

Но я нахожуСекция потоков в стандарте довольно непроницаема, и всегда есть правило «как будто».Поэтому я не могу обещать вам, что использование deque снизу (и консолидация, когда кто-то запрашивает строку / буфер) на самом деле запрещено.

3 голосов
/ 31 октября 2010

Поставщик стандартной библиотеки должен решать, как реализовать stringstream (или любую другую библиотечную функцию в этом отношении). Вы можете посмотреть на заголовок sstream, поставляемый с вашим компилятором, чтобы увидеть, как он там реализован. Это много с теоретической стороны ...

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

Если ваши измерения показывают, что производительность ostringstream действительно является проблемой для вас, рассмотрите возможность использования Boost.Karma . Конечно, есть больше причин использовать Boost.Karma, чем просто производительность, поэтому, если вы начинаете новый код, а не хотите модифицировать существующий, используя строковые потоки, вы можете использовать Karma с самого начала. *

...