Должен ли я предварительно выделить std :: stringstream? - PullRequest
19 голосов
/ 21 декабря 2009

Я широко использую std::stringstream для создания строк и сообщений об ошибках в моем приложении. stringstreams обычно являются автоматическими переменными с очень коротким сроком службы.

Приведет ли такое использование к перераспределению кучи для каждой переменной? Должен ли я перейти от временной переменной stringstream к члену класса?

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

Ответы [ 2 ]

11 голосов
/ 21 декабря 2009

Вы профилировали свою казнь и обнаружили, что она является источником замедления?

Рассмотрим их использование. Они в основном для сообщений об ошибках за пределами нормального потока вашего кода?

Что касается резервирования места ...

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

Другой вариант может быть (не проверен!)

std::string str;
str.reserve(50);
std::stringstream sstr(str);

Вы можете найти еще несколько идей в этой теме gamedev .

редактирование:

Обход с помощью stringstream rdbuf также может быть решением. Этот подход, вероятно, очень прост, но, пожалуйста, убедитесь, что он абсолютно необходим . Определенно не элегантный или лаконичный.

2 голосов
/ 03 января 2013

Я не уверен, но подозреваю, что stringbuf из stringstream тесно связано с результатом string. Поэтому я подозреваю, что вы можете использовать ss.seekp(reserved-1); ss.put('\0'); для резервирования reserved количества байтов внутри базового string из ss. На самом деле я хотел бы увидеть что-то вроде ss.seekp(reserved); ss.trunc();, но для потоков нет метода trunc().

...