Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 19:55
Beim Packed Record wird der Record, sofern möglich gepackt. Im Gegensatz zu ANSI bzw. UCSD-Pascal aber nur auf Byte-Ebene.
Delphi-Quellcode:
Type
  TNibble = 0..15;
  T1 = Record
    a, c : TNibble;
    b : Integer;
    End;
  T2 = Packed Record
    a, c : TNibble;
    b : Integer;
    End;
SizeOf (T2) liefert Delphi 6, bei UCSD-Pascall jedoch 3 (0,5 bytes für a und c und 2 bytes für b, integer ist/war 16 bit). Auf diese Weise hat man früher Bitsets und Statusbytes implementiert. Es war nicht definiert, das eine Menge als Bitset implementiert ist, aber die Packed Records wurden von N.Wirth eindeutig definiert. Aus Gründen der Performance ist man dann davon abgekommen, was eigentlich Schade ist.

Beim SizeOf (TSomeRecord) werden nicht die Größen der einzelnen Record-Elemente addiert, sondern wirklich die Größe des Records, die dieser im Speicher verbraucht, angegeben. So, wie es sein soll. Der Compiler erzeugt beim Parsen der Typdefinition die Offsets der Record-Elemente. Die Recordgröße ergibt sich dann zwangsläufig aus dem höchsten Offset + SizeOf (ThisElement), Auf 1 bzw. 4 Bytes aufgerunden, je nach "Packed" und Compiler-Einstellungen.

Auch wird kein "DataTree" zum Ermitteln der Speichergröße verwendet, sondern eine simple Lookupliste. Dort stehen einfach die Variablen und deren Datentyp drin. Der Compiler muss ja wissen, ob eine Variable deklariert ist, und welcher Datentyp das ist. Im Prinzip stimmt das aber Alles, was dazu erwähnt wurde...

Das ist nur als Anmerkung zu Tommie-Lie's Post gedacht...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat