Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#3

AW: Padding Bytes herausfinden

  Alt 20. Feb 2018, 13:12
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Feb 2018 um 13:23 Uhr)
  Mit Zitat antworten Zitat