Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Speicherlayout von dynamischen Arrays (https://www.delphipraxis.net/203597-speicherlayout-von-dynamischen-arrays.html)

Der schöne Günther 3. Mär 2020 17:14


Speicherlayout von dynamischen Arrays
 
Wie ist ein dynamisches Array im Speicher aufgebaut? Die einzige Info die ich fand war von Delphi 2007:

http://docs.embarcadero.com/products...rmats_xml.html unter "Dynamic Array Types"

Delphi-Quellcode:
s = sizeOf(T)
OffsetContent
-8Reference count
-4Length indicator
0..Length * s -1Element [0]


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;

Uwe Raabe 3. Mär 2020 17:24

AW: Speicherlayout von dynamischen Arrays
 
Die aktuelle Doku ist doch ziemlich aussagekräftig: http://docwiki.embarcadero.com/RADSt...he_Array-Typen

Der schöne Günther 3. Mär 2020 17:25

AW: Speicherlayout von dynamischen Arrays
 
Ich war zu dumm genau das zu finden. Vielen Dank 👍

himitsu 3. Mär 2020 17:56

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:
Delphi-Referenz durchsuchenUniqueString
Delphi-Referenz durchsuchenStringRefCount
_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 08:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz