Несколько баллов:
Сначала вместо #ifdef CXX11_AVAILABLE
вы хотите проверить if __cplusplus > 201103L
;для объяснения см .:
http://stackoverflow.com/questions/11053960/ddg#11054055
Теперь у вас все равно будет хотя бы одна копия, просто добавив строку в ostringstream
, независимо от того, какой C ++версию, которую вы используете.
Кроме того, вы будете создавать и уничтожать ostringstream
с каждым чертовым вызовом на toString()
- это ужасно!... хотя бы выполните:
namespace detail {
inline std::ostringstream& get_ostringstream(){
static thread_local std::ostringstream stream;
stream.str("");
stream.clear();
return stream;
}
} // namespace detail
, а затем в toString()
замените
std::ostringstream oss;
на
std::ostringstream& oss = detail::get_ostringstream();
Наконец, запомните, что окончательная копия- oss.str()
подлежит Оптимизации возвращаемого значения (RVO) , что в C ++ 17 является обязательным и для более раннего стандарта применялось большинством компиляторов.Поэтому, если вы инициализируете строку с результатом функции, создание копии oss.str()
будет происходить по адресу этой внешней строки.
Редактировать: На самом деле, если это критичный для производительности код, вы просто не должны использовать функции преобразования строк общего назначения и, возможно, вообще не использовать std::string
.Конечно, прежде чем что-то настраивать, запишите профиль и проверьте, где у вас проблемы с производительностью.