Значение в std :: string при сохранении обратной совместимости - PullRequest
0 голосов
/ 14 мая 2018

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

     template<typename T>
     std::string toString(T parm)
     {
#ifdef CXX11_AVAILABLE
         return std::to_string(parm);
#else
         std::ostringstream stream;
         stream << parm;

         return stream.str();
#endif
     }

Будет ли он создавать копию в памяти, если я сделаю это так?
Заранее спасибо за ваши ответы:)

1 Ответ

0 голосов
/ 14 мая 2018

Несколько баллов:

Сначала вместо #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.Конечно, прежде чем что-то настраивать, запишите профиль и проверьте, где у вас проблемы с производительностью.

...