Also "Messen", siehe Uwe Raabe,
oder selber berechnen. So schwer ist die Logic nicht.
Bei krumen Sondertypen, wie dem Extended, oder geheimen Typen ala Variant, die nicht gleich als Record erkennbar sind, muß man nur erstmal genauer hinschauen und notfalls ein bissl rumprobieren.
Erstmal kommt es drauf an, wie der Compiler eingestellt ist.
http://docwiki.embarcadero.com/RADSt...ichten_(Delphi)
TMyRecord = packed record
enspricht
{$A1}
.
Früher war es mal
{$A4}
und aktuell (seit knapp 10 Jahren) ist es meisten
{$A8}
.
Und dann kann man das alles problemlos ausrechnen.
Delphi-Quellcode:
{$ALIGN 4}
TMySubRecord = record
x: Word;
y: Word;
end;
// oder
TMySubRecord = array[0..1] of Word;
TMyRecord = record
a: Byte;
// ( 3 Padding Bytes)
b: Integer;
c: Int64;
d: TMySubRecord;
end;
Code:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
a . . . b b b b c c c c c c c c d d d d
"a" ist 1 Byte, also wird es auf ganz 1-Byte ausgerichtet.
"b" ist 4 Byte, also wird es auf ganz 4-Byte ausgerichtet.
"c" ist 8 Byte, also würde es auf ganz 8-Byte ausgerichtet, aber da ALIGN=4, wird es gekürzt und somit auf ganz 4-Byte ausgerichtet.
"d" ist 4 Byte, aber laut seine "internen" Ausrichtung auf maximal 2 Byte ausgerichtet, also wird es auf ganz 2-Byte ausgerichtet.
Wäre "b" ein Word, würde es auf 2 ausgerichtet und somit 2 Felder nach links rutschen.
Code:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 - ALIGN 4
a . b b c c c c c c c c d d d d
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 - ALIGN 8
a . b b . . . . c c c c c c c c d d d d . . . .
Am Ende wird der RECORD nochmal mit dem aufgefüllt, was dem größten enthalten Typen entspricht, abgerundet auf das ALIGN.
Das $ALIGN ist sowas wie eine MAXimale Begrenzung für die Ausrichtung.
Und Arrays "quasi" wie PACKED ... sie nehmen das ALIGN ihrer Felder an, welche keinen Freiraum zwischen sich lassen, abgesehn von ihrem eigenen Padding.