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.
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.