Здравствуйте, Went, Вы писали:
BFE>>Короче, можете объяснить: где вы предполагаете возможность оптимизации?
W>Выражение $"Get {count} of {fruit}.".
W>По отношению к конкатенации ("Get " + std::to_string(count) + " of " + fruit + ".") — нет необходимости многократно перевыделять буферы и копировать.
Ну ка же нет?
результат преобразования {count} в строку может иметь разную длину:
Get 1 of apple.
Get 22 of apple.
Значит копирование строки " of " в заранее выделенный буфер всё равно придётся делать.
{fruit} — строка переменной длины, значит заранее под неё заказать буфер не получится. Следовательно, так или иначе будет копирование строк "Get 1 of " и "apple" в некий третий буфер, который динамически придётся выделять. Да в этом третьем буфере можно заранее учесть завершающую точку и зарезервировать под неё место, но такого рода оптимизации выглядят сомнительно, особенно учитывая, что std::string хорошо оптимизированы для коротких строк и заранее выделяют память под возможное увеличение, ЕМНИП.
Вот пример из исходников:
template<typename _CharT, typename _Traits, typename _Alloc>
_GLIBCXX20_CONSTEXPR
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{
#if _GLIBCXX_USE_CXX11_ABI
using _Alloc_traits = allocator_traits<_Alloc>;
bool __use_rhs = false;
if _GLIBCXX17_CONSTEXPR (typename _Alloc_traits::is_always_equal{})
__use_rhs = true;
else if (__lhs.get_allocator() == __rhs.get_allocator())
__use_rhs = true;
if (__use_rhs)
#endif
{
const auto __size = __lhs.size() + __rhs.size();
if (__size > __lhs.capacity() && __size <= __rhs.capacity())
return std::move(__rhs.insert(0, __lhs));
}
return std::move(__lhs.append(__rhs));
}
Тут можно видеть, что если есть возможность не перераспределять память, то выполняется простое копирование.
Наверное где-то можно выиграть 1%-2%, но у меня большие сомнения что это имеет смысл.