![]() |
Speicherlayout von dynamischen Arrays
Wie ist ein dynamisches Array im Speicher aufgebaut? Die einzige Info die ich fand war von Delphi 2007:
![]()
Delphi-Quellcode:
s = sizeOf(T)
Wenn ich es richtig sehe, gilt das nur für Win32, unter Win64 ist der Längenindikator 8 Byte lang während der Referenzzähler 4 Byte geblieben ist. Richtig? Heißt: Wollte ich den Referenzzähler eines dynamischen Arrays bestimmen würde es lauten
Delphi-Quellcode:
{$POINTERMATH ON}
/// <param name="ptr"> /// Zeiger auf das erste Element des Arrays (also <c>@myArray[0]</c>) /// </param> function GetArrayRefCount(ptr: PNativeUInt): NativeUInt; //inline; var refCount: PInteger; // Not native int begin Dec(ptr, 1); // now pointing to length indicator refCount := PInteger(ptr); Dec(refCount); Result := refCount^; end; |
AW: Speicherlayout von dynamischen Arrays
Die aktuelle Doku ist doch ziemlich aussagekräftig:
![]() |
AW: Speicherlayout von dynamischen Arrays
Ich war zu dumm genau das zu finden. Vielen Dank 👍
|
AW: Speicherlayout von dynamischen Arrays
Da LongStrings (AnsiString und UnicodeString) auch nur aufgemotzte dynamische Arrays sind,
könnte man bei diesen abgucken, bzw. über einen bösen Cast (Array>String) die öffentlichen Systemfunktionen verwenden. Tipps für System.pas: ![]() ![]() _AddRefArray StrRec TDynArrayRec Und bevor sich wer beschwert: Ja, für Arrays fehlt da bissl was Öffentliches, was nicht nur exklusiv in der System-Unit verwendet wird. Bei dynamischen arrays gibt es leider keine Konstanten (k.A. warum), also nur bei Strings muß man aufpassen, wenn man auf den geheimen RecCount -1 trifft, denn das ist eine Konstante. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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 by Thomas Breitkreuz