Re[14]: Полухин - что там с С++26
От: Went  
Дата: 29.01.26 17:58
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Went, Вы писали:


BFE>>>Короче, можете объяснить: где вы предполагаете возможность оптимизации?

W>>Выражение $"Get {count} of {fruit}.".
W>>По отношению к конкатенации ("Get " + std::to_string(count) + " of " + fruit + ".") — нет необходимости многократно перевыделять буферы и копировать.

BFE>Ну ка же нет?

BFE>результат преобразования {count} в строку может иметь разную длину:
BFE>Get 1 of apple.
BFE>Get 22 of apple.
BFE>Значит копирование строки " of " в заранее выделенный буфер всё равно придётся делать.
BFE>{fruit} — строка переменной длины, значит заранее под неё заказать буфер не получится. Следовательно, так или иначе будет копирование строк "Get 1 of " и "apple" в некий третий буфер, который динамически придётся выделять. Да в этом третьем буфере можно заранее учесть завершающую точку и зарезервировать под неё место, но такого рода оптимизации выглядят сомнительно, особенно учитывая, что std::string хорошо оптимизированы для коротких строк и заранее выделяют память под возможное увеличение, ЕМНИП.

Я так понимаю. Интерполяция:
1. Приводим count к строке (1 выделение).
2. Суммируем длину строки count, длину строки fruit и длину строки подстановки.
3. Выделяем строку нужного размера (2 выделение).
4. Копируем в неё "Get ", строку count, " of ", строку fruit, "." (15 копирований).
Строго говоря, у нас 2 выделения и 15 копирований.
Теперь сложение.
1. Приводим count к строке (1 выделение).
2. Выделяем строку под "Get " и строку count. Копируем туда (2 выделения и 5 копирований).
3. Выделяем строку под "Get 1 of ", и копируем туда "Get 1" и " of " (уже 3 выделения и 5 + 5 + 4 = 14 копирований)
4. Аналогично для fruit (уже 4 выделения и 14 + 14 + 5 = 33 копирования)
5. Аналогично для "." (уже 5 выделений и 33 + 33 + 1 = 67 копирований).
То есть, у нас 5 выделений и 67 знаков скопировать.
Мог где-то ошибиться, но суть, я думаю, ясна. Если строка с оптимизацией для малых строк, выделений можно избежать, но разница в количестве копирований останется. Однако в реале, интерполяция на очень коротких строках используется редко, так что выделения будут. Кстати, я опустил запись терминального нуля. А с ним копирований будет еще больше (ведь программа не знает, что это промежуточный вариант и ноль можно не писать).
Если я где-то ошибаюсь, подскажите где именно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.