169 похожих чатов

Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString):

AnsiString;
Как мне в её теле сделать вот так?
Result:=Concat(a);
А не грустный вариант:
var i:integer;
begin
for i:=0 to High(a) do Result:=Result+a[i];
С таким условием: не использовать в явном виде Move, ну т.е. средствами языка, RTL или чего оно там
ну и не предлагать варианты создать список загнать туда и потом как текст выгнать

Смысл в том, чтобы за один присест менеджера памяти сформировать новую строку

15 ответов

16 просмотров

stringbuilder? но я бы посчитал требуемое место и поmoveил

TStringBulder?

notme- Автор вопроса
zamtmn
stringbuilder? но я бы посчитал требуемое место и ...

Ага, стринг билдер НО! Блин в Delphi уже есть Concat (магия), в FPC тоже есть Concat(магия) который под капотом превращается итак в fpc_AnsiString_Concat_multi, которая, в свою очередь, принимает аргументом итак уже const array of AnsiString Но эта прослойка магическая в виде Concat'а туповата и не может const array of AnsiString просто напрямую перетранслировать нижележащей функции

notme- Автор вопроса

Я поначалу думал, что это не пройдёт Из-за того, что Delphi так не умеет... но теперь думаю, что обратная совместимость то не нарушится... так что можно попробовать

notme- Автор вопроса
Александр (Rouse_) Багель
TStringBulder?

Получше конечно тупого цикла Но когда знаешь, что под капотом оно может вообще без динамических перевыделений памяти (при росте внутреннего буфера, если заранее неизвестен общий размер строк) - то хочется найти способ это использовать

notme
Получше конечно тупого цикла Но когда знаешь, что ...

То что ты описал - это как раз магия. Размер неизвестен но реаллокация отсутствует :) так не бывает

notme- Автор вопроса
Александр (Rouse_) Багель
То что ты описал - это как раз магия. Размер неизв...

Охохохо! Заруба! ) Ну тогда в Delphi смотри _LStrCatN А в FPC fpc_ansistr_concat_multi 😄

notme
Охохохо! Заруба! ) Ну тогда в Delphi смотри _LStrC...

Посмотрел, сначала считается общая длина строк, потом выделяется буфер потом move в буфер. И?

notme- Автор вопроса
Александр (Rouse_) Багель
Посмотрел, сначала считается общая длина строк, по...

И тут в том - что выделяется 1 раз ровно столько сколько нужно

notme
И тут в том - что выделяется 1 раз ровно столько с...

Ну, а ты чо написал - размер неизвестен реаллокации нет. Так не бывает, ибо тут размер известен

notme- Автор вопроса
Александр (Rouse_) Багель
Ну, а ты чо написал - размер неизвестен реаллокаци...

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);

notme- Автор вопроса
notme
TStringBuilder'у заранее размер неизвестен Это сна...

Под капотом уже всё готово, просто надо дать доступ

notme
TStringBuilder'у заранее размер неизвестен Это сна...

Никому не известно но чтобы выделить буфер нужно сначала узнать размер, если общий размер не известен- тогда реаллокация. Либо то либо это, чтоб ни то ни это - так ещё не научились

notme- Автор вопроса
Александр (Rouse_) Багель
Никому не известно но чтобы выделить буфер нужно с...

Принимаю твою формулировку Но - оцени как выглядит код со TStringBuilder'ом и с гипотетическим Concat

Похожие вопросы

Обсуждают сегодня

Типа вызывать GetParent и проверять на соответствие GetModuleHandle?
The Bird of Hermes
67
Do any of you guys have interesting projects one could join? I'm a Middle Full-Stack developer (JS/TS, React & Node)
Lev Shapiro
40
$res = json_decode($наша строка из респонса); $res1 = array_map(fn($o) => $o->name, $res->breadcrumbs[0]->entities); Как такое будет на Хаскеле?.. В начале весь джейсон, в ко...
Хаскель Моисеевич Гопник
27
В чем сила брат, в NASM или FASM?
Isaac Kleiner
18
Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
11
Хтось використовував Vapor на Windows?
Jaroshevskii
15
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
52
Тут кста кто-нибудь NeoVim использует?
Simple Sorcerer
13
Оба варианта в целом подходят, но скорее создание конфликтной ситуации (на пустой основе). В прошлый раз он сказал мне про ESP32, я забыл про этот микроконтроллер, ошибся, я п...
КТ315
4
Карта сайта