Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.
Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.
Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
Re: Использование внешнего буфера для stringstream
Здравствуйте, Аноним, Вы писали:
А>Коллеги, приветствую
А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям. А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
написать свой streambuf (наследник стандартного) и подсовывать его при создании stringstream
Re: Использование внешнего буфера для stringstream
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
Если все равно есть желание использовать статический массив, то рекомендую старый (не)добрый snprintf.
Да здравствует мыло душистое и веревка пушистая.
Re: Использование внешнего буфера для stringstream
Здравствуйте, Аноним, Вы писали:
А>Коллеги, приветствую
А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям. А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
char buf[0x1000];
std::stringstream ss;
ss.rdbuf()->pubsetbuf(buf, sizeof buf);
ss << "abc"; // пишется в buf
// ...
// скопировать buf в строку
std::string buf_contents(buf, ss.tellg()); // в buf записали tellg() байт
Re[2]: Использование внешнего буфера для stringstream
Здравствуйте, Аноним, Вы писали:
А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям. А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
Устаревший strstream кое-что на эту тему умел (за что и поплатился). А вообще, какие проблемы реализовать свой стрим (вернее, стримбуф)? С boost::iostreams это делается с полпинка.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Использование внешнего буфера для stringstream
Здравствуйте, Аноним, Вы писали:
А>Коллеги, приветствую
А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям. А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).