Re[13]: Полухин - что там с С++26
От: B0FEE664  
Дата: 27.01.26 10:53
Оценка:
Здравствуйте, 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%, но у меня большие сомнения что это имеет смысл.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.