Должен ли я переназначить std:: stringstream?
Я использую std::stringstream
для создания строк и сообщений об ошибках в своем приложении. stringstreams
обычно представляют собой очень короткие переменные времени жизни.
Будет ли такое использование вызывать перераспределение кучи для каждой переменной? Должен ли я переключиться с временной переменной на класс stringstream
?
В последнем случае, как я могу зарезервировать буфер stringstream
? (Должен ли я инициализировать его с помощью достаточно большой строки или есть более элегантный метод?)
Ответы
Ответ 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()
.