skalogryz
> Намерение в том, чтобы сделать ровно одну аллокацию для новой строки, т.к. размероность всех входящих данных заранее известно.
Как? Расскажи подробнее.
Почему перегруженный оператор + будет хуже знать под что он выделяет строку.
А как должен "догадываться" format %s ?
Дичь говорите, но сами похоже в неё верите.
=A=L=X=
> Почему перегруженный оператор + будет хуже знать под что он выделяет строку.
ну как же ш... у тебя каждой оператор +, должен вернуть новую строку.
a + b + c
это 2 аллокации: ab , и abc
перегруженный оператор так и работает, он перёд 2 операнда, и возвращает 1 результат.
если оператор не будет перегруженный, а будет встроенный в язык. Тогда компилятор, сможет осилить и заменить несколько "+" в один concat() вызов. Который для результирующей строки сделает одно выделение памяти.
=A=L=X=
> А как должен "догадываться" format %s ?
1) парсишь входящую строку - находишь размер "шаблонных кусков" (всё то, что не является %s, %d и т.д.)
2) пробегаешься по входящим параметрам (проверяешь типы, приводишь их к "строке")
3.1) если нужно на выхлопе получить строку складываем размеры каждого из кусков, найденных в шагах 1 и 2 и делаем одну аллокацию, а потом каждый кусок последовательно move в новую строку
3.2) если на выхлопе не нужно строку получать, а просто сливать строку куда-то там в файл или поток, то просто каждый кусок последовательно делаем move, output или чего-там по нужно адресу.
=A=L=X=
> Почему перегруженный оператор + будет хуже знать под что он выделяет строку.
дело не в отдельном +, а в последовательности.
a + b
мало чем уступает
printf(a, b)
но a+b+c уже начинаются вопросы.
Лично был свидтелем код, который тормозил, потому что был целиком написан на a+b реализации.
И на тестах с маленькими данными, работал идеально. Но в продакшене, данные оказались чуток подлинее, и тормоза оказывались существенными.
Веб сервис, определённые запросы, вместо 100 мс умудрялся обрабатывать > 30 секунд. (Код тупо копировал одни и те же данные из одного место в другое, но поширше предыдущего)
Код был написан на делфи. (а там a+b, сам бог велел писать).
skalogryz
> Веб сервис, определённые запросы, вместо 100 мс умудрялся обрабатывать > 30 секунд. (Код тупо копировал одни и те же данные из одного место в другое, но поширше предыдущего)
>
> Код был написан на делфи. (а там a+b, сам бог велел писать).
Так ты послушай - я на С++ недавно писал программу и она зависла!
Прикинь?
С/C++ говно я не языки, просто по логике твоей днище днистое, нерабочий хлам.
Истинно говорю я, а ты пиздец какой то выдумываешь сам в него не веря.
Какой травмой детства и изнасилованием в жопу малолетки конечно проникнуты тут высказывавшиеся на тему того что нельзя конкатенировать строку и число вот просто как оно есть в скриптовых языках мне лично НЕВЕДОМО.
Это непостижимо. Какие то вот травмы видимо глубокие. Слава богу у меня ничего такого не случалось.
ты можешь складывать строки попарно!
вопрос только в том, как часто ты это будешь делать, и не придётся ли потом такие места оптимизировать.
=A=L=X=
> С/C++ говно я не языки, просто по логике твоей днище днистое, нерабочий хлам.
зачем доказывать очевидное?
=A=L=X=
> конкатенировать строку и число вот просто как оно есть в скриптовых языках мне лично НЕВЕДОМО.
так это неудобно (если делать плюсом, а не &) . Получил от пользователя ввод, забыл перевести из строки в число потому что этот ввод прошёл через кучу всяких уровней абстракции (и один из них оказывается иногда возвращает строку а не число), и вот у тебя пошло молотить делая 2+2=22 (а ошибка вылезет не там а в месте первого минуса/деления/синуса и гадай потом).
=A=L=X=
> Я не понимаю
Верю.
kipar
> если делать плюсом, а не &
& в плюсе — это битовое и, так что не варик.
В луа, конкатенация строк — это .. (две точки).
В хаскеле — это <> (ромбик из меньше-больше).
В плюсах — а там все операторы так или иначе уже заняты, так что только хрен сосать. Авось в каком-нибудь C++2090 таки дойдут и исправят.
kipar
> так это неудобно
То есть вместо a + b неудобно писать a + std::to_string(b)?
Шта?
Какое определение "неудобности" тут подразумевается? Ибо оно явно отличается от классики.
Имбирная Ведьмочка
> В плюсах — а там все операторы так или иначе уже заняты, так что только хрен сосать. Авось в каком-нибудь C++2090 таки дойдут и исправят.
Это называется Arduino - см. ссылку в первопосте, всё работает прямо сейчас и работало 20 лет назад как минимум.
Шоры просто надо снять.
Только строки в стиле си ... Только хардкор ...
=A=L=X=
удобно писать a<<b, a#b, a~b, a&b, в общем лишь бы не плюс а отдельный оператор.
kipar
> в общем лишь бы не плюс а отдельный оператор.
Это гордость и предубеждение в Лас-Вегасе какое то.
Что плохого будет если не плюс?
Имбирная Ведьмочка
> То, что нужно в 99% случаев — это форматирование, а оно делается через printf-подобный интерфейс
Согласен
https://en.cppreference.com/w/cpp/utility/format/format
(since C++20)
Ну не чмошники?
А что мешает страждущему перегрузить этот оператор для std::string самостоятельно и погрузиться в блаженную негу?
Лично мне такое "богатство" нафиг не упёрлось. Я бы еще руки оторвал гениям, которые придумали для строк всякие хитрые конструкторы принимающие числа, чары и их комбинации.