AnsiString;
Как мне в её теле сделать вот так?
Result:=Concat(a);
А не грустный вариант:
var i:integer;
begin
for i:=0 to High(a) do Result:=Result+a[i];
С таким условием: не использовать в явном виде Move, ну т.е. средствами языка, RTL или чего оно там
ну и не предлагать варианты создать список загнать туда и потом как текст выгнать
Смысл в том, чтобы за один присест менеджера памяти сформировать новую строку
stringbuilder? но я бы посчитал требуемое место и поmoveил
TStringBulder?
Ага, стринг билдер НО! Блин в Delphi уже есть Concat (магия), в FPC тоже есть Concat(магия) который под капотом превращается итак в fpc_AnsiString_Concat_multi, которая, в свою очередь, принимает аргументом итак уже const array of AnsiString Но эта прослойка магическая в виде Concat'а туповата и не может const array of AnsiString просто напрямую перетранслировать нижележащей функции
Я поначалу думал, что это не пройдёт Из-за того, что Delphi так не умеет... но теперь думаю, что обратная совместимость то не нарушится... так что можно попробовать
Получше конечно тупого цикла Но когда знаешь, что под капотом оно может вообще без динамических перевыделений памяти (при росте внутреннего буфера, если заранее неизвестен общий размер строк) - то хочется найти способ это использовать
То что ты описал - это как раз магия. Размер неизвестен но реаллокация отсутствует :) так не бывает
Охохохо! Заруба! ) Ну тогда в Delphi смотри _LStrCatN А в FPC fpc_ansistr_concat_multi 😄
Посмотрел, сначала считается общая длина строк, потом выделяется буфер потом move в буфер. И?
И тут в том - что выделяется 1 раз ровно столько сколько нужно
Ну, а ты чо написал - размер неизвестен реаллокации нет. Так не бывает, ибо тут размер известен
TStringBuilder'у заранее размер неизвестен Это снаружи где-то считать ручками нужно Удобство использования (и простота кода, его чтения): 1. Вариант var b: TStringBuilder; i,l: integer; begin l:=0; for i:=0 to high(arr) do l:=l+Length(arr[i]); b:=TStringBuilder.Create(arr, l); 2. Вариант Concat(arr);
Под капотом уже всё готово, просто надо дать доступ
Никому не известно но чтобы выделить буфер нужно сначала узнать размер, если общий размер не известен- тогда реаллокация. Либо то либо это, чтоб ни то ни это - так ещё не научились
Принимаю твою формулировку Но - оцени как выглядит код со TStringBuilder'ом и с гипотетическим Concat
Обсуждают сегодня