![]() |
Mehrere Strings effizient verketten
Man kann ja Ansi-Strings einfach mit dem + Operator zusammenhängen.
Wenn die Strings aber länger sind, kann dies allerdings ziemlich ineffizient werden, da für jedes Zwischenergebnis eine Speicherreservierung und ein Verschieben von Daten eforderlich wird. Dies kann auch zu einem ständig zunehmenden Speicherverbrauch führen, da jedes Zwischenergebnis länger als sein Vorgänger ist. Also werden dann immer neue Blocke von Windows angefordert. Folgende Funktion vermeidet die Zwischenergebnisse (es sollten aber mindestens 3 Strings übergeben werden, sonst lohnt sich das nicht):
Delphi-Quellcode:
Beispiel für die Verwendung:
function StrArrayConcat(const a : array of string):string;
var i, j,total_len : Integer; s : string; begin total_len := 0; for i := Low(a) to High(a) do Inc(total_len, Length(a[i])); SetLength(Result, total_len); j := 1; for i := Low(a) to High(a) do begin s := a[i]; if s <> '' then begin Move(s[1], Result[j], Length(s)); Inc(j, Length(s)); end; end; end;
Delphi-Quellcode:
var
a,b,c,d,s: string; begin a := ... b := ... c := ... d := ... // s := a + b + '***********' + c + d s := StrArrayConcat([a,b,'***********',c,d]); |
Re: Mehrere Strings effizient verketten
himitsu schlägt folgende Optimierung vor:
Delphi-Quellcode:
Sein Kommentar:
function StrArrayConcat(const a : array of string):string;
var i, j, k : Integer; begin j := 0; for i := Low(a) to High(a) do Inc(j, Length(a[i])); SetLength(Result, j); j := 0; for i := Low(a) to High(a) do if a[i] <> '' then begin k := Length(a[i]); MoveMemory(PChar(Pointer(Result)) + j, Pointer(a[i]), k); Inc(j, k); end; end; Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz