Подтвердить что ты не робот

Должен ли я переназначить std:: stringstream?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

изменить

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

Ответ 2

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