Warum ist die Größe eines Datensatzes nicht gleich der Summe der Größen seiner Felder?

8

Ich habe den nächsten Code:

%Vor%

Das Programm zeigt die folgende Meldung an:

%Vor%

Warum ist SizeOf(TRecord3) gleich 136 anstatt 134?

    
Xaver 21.03.2012, 10:54
quelle

2 Antworten

15

Dies ist auf das Auffüllen zurückzuführen, das aufgrund der Datensatzausrichtung hinzugefügt wurde. TRecord3 hat eine Ausrichtung von 4, da es single -Werte enthält. Und so wird das Padding am Ende des Datensatzes hinzugefügt, um die Größe zu einem exakten Vielfachen von 4 zu machen. Deshalb ist die Größe 136 und nicht der Wert von 134, den Sie erwartet haben.

Sie können Ihren Datensatz als packed deklarieren oder die Compiler-Option für die Ausrichtung auf $ALIGN 1 setzen. Bei einer Ausrichtung von 1 wird dem Datensatz kein Padding und SizeOf(TRecord3)=134 hinzugefügt. Ich empfehle jedoch dringend, dies nicht zu tun. Die Verwendung der natürlichen Ausrichtung führt zu dem effizientesten Speicherzugriff für Datensätze. Zum Beispiel ist es für den Prozessor teurer, einen fehlausgerichteten Wert zu laden, als einen ausgerichteten Wert zu laden. Für eine single oder eine integer ist die natürliche Ausrichtung auf einer 4 Byte Grenze. Bei einem double liegt die natürliche Ausrichtung an einer 8-Byte-Grenze und so weiter. Sie sollten gepackte Datensätze verwenden, wenn Sie Binärkompatibilität mit einer anderen Bibliothek benötigen, die gepackte Datensätze verwendet.

    
David Heffernan 21.03.2012, 10:56
quelle
4

Dies ist auf die Ausrichtung zurückzuführen. Die Felder in dem Datensatz werden auf 4 Bytes oder 8 Bytes (oder Bytes, wenn nur Bytes in dem Datensatz verwendet werden) in einer solchen Weise ausgerichtet, dass der Datensatz, wenn in einem Array alle Felder ausgerichtet sind, weiterhin ausgerichtet wird. Wenn Sie möchten, dass die Formel funktioniert, sollten Sie einen "gepackten Datensatz" verwenden. Beachten Sie, dass die Felder möglicherweise nicht ausgerichtet sind und die Leistung beeinträchtigen könnten.

    
Ritsaert Hornstra 21.03.2012 11:09
quelle

Tags und Links