Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record vs. Packed Record, Delphi6 vs. D2007 (https://www.delphipraxis.net/104253-record-vs-packed-record-delphi6-vs-d2007.html)

Tyrael Y. 30. Nov 2007 09:28


Record vs. Packed Record, Delphi6 vs. D2007
 
Hallo zusammen,

ich habe heute morgen einen Fehler im Programmverlauf festgestellt.
Auf mühsamer Suche habe ich festgestellt, daß das Programm, wenn ich es mit Delphi6 compiliere so läuft wie ich es erwarte und mit Delphi2007 eben nicht.

Letzendlich habe ich rausgefunden, daß es eine Struktur(record) im Source war, daß als normales record definiert war.
SizeOf von diesem Record in D7 hat 50 Byte ergeben, was richtig war.
SizeOf von diesem Record in D2007 hat 52 Byte ergeben, was falsch für meine weiteren Berechnungen war.

Definiere ich den Record als packed record, ist das SizeOf bei beiden Versionen 50Byte, also völlig richtig.

So wie es aussieht lag es wohl an der Option "Record-Felder ausrichten" in der IDE, was bei mir bei 2007 auf 8 gestellt war.
Stelle ich die Option auf den Wert 1 ist der record wieder bei SizeOf 50 Byte groß.


Was hat es genau mit dieser Option auf sich? Was würde 2, 3, usw. bedeuten?

mkinzler 30. Nov 2007 09:33

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
bei einem Alignment von 1 wären ja alle record packed.
8 bedeutet auf Bytegrenzen ausrichten.

Tyrael Y. 30. Nov 2007 09:35

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
...also wäre es besser die Option auf 8 zu belassen und diesen einen Record zum packed Record zu machen, damit alle anderen Records schnelleren Zugriff ermöglichen, richtig?


Edit...mal auch für andere

Zitat:

Steuert die Ausrichtung von Feldern in Delphi-Record-Typen und Klassenstrukturen.
Wenn Sie die Option 1 (entspricht {$A1}) wählen oder die Option deaktivieren (entspricht {$A-}), werden Felder nicht ausgerichtet. Alle Records und Klassenstrukturen werden gepackt.
Wenn Sie die Option 2 (entspricht {$A2}) wählen, werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Wortgrenzen ausgerichtet.
Wenn Sie die Option 4 (entspricht {$A4}) wählen, werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Doppelwortgrenzen ausgerichtet.
Wenn Sie die Option 8 (entspricht {$A8} oder {$A+}) wählen, werden die ohne den Bezeichner packed deklarierten Felder in Record-Typen und die Felder in Klassenstrukturen auf Vierfachwortgrenzen ausgerichtet. Variablen und typisierte Konstanten werden unabhängig von der Direktive $A immer für einen optimalen Zugriff ausgerichtet. Durch Setzen der Option auf 8 wird die Ausführung beschleunigt.

mkinzler 30. Nov 2007 09:38

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
Ja.

Muetze1 30. Nov 2007 10:23

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
Zitat:

Zitat von mkinzler
bei einem Alignment von 1 wären ja alle record packed.
8 bedeutet auf Bytegrenzen ausrichten.

Die zitierte Hilfe hat es schon gezeigt, aber trotzdem nochmal zur Korrektur: 8 bedeutet, die Elemente auf eine glatt durch 8 teilbare Adresse aus zu richten. Die Granularität zum ausrichten liegt bei 8 Bytes.

Chewie 30. Nov 2007 10:26

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
Zitat:

Durch Setzen der Option auf 8 wird die Ausführung beschleunigt.
Aber nur auf einem 64Bit-System. Bei einem 32Bit-System ist ja der Zugriff auf 4-Byte-Grenzen genauso schnell.

Wie sieht das aber aus bei einem 64Bit-System, was im 32-Bit-Modus betrieben wird (was ja bei modernen Rechnern der übliche Fall sein dürfte)? Ist in diesem Fall ein "Speicherwort" 32 oder 64 Bit groß?

Bernhard Geyer 30. Nov 2007 10:31

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
Zitat:

Zitat von Chewie
Aber nur auf einem 64Bit-System. Bei einem 32Bit-System ist ja der Zugriff auf 4-Byte-Grenzen genauso schnell.

AFAIK hängt das von der Optimierung des Chipsatzes bzw. der CPU ab ob ein Alignment mit 4/8 oder was immer für Werte günstiger ist.

Muetze1 30. Nov 2007 10:46

Re: Record vs. Packed Record, Delphi6 vs. D2007
 
Zitat:

Zitat von Chewie
Zitat:

Durch Setzen der Option auf 8 wird die Ausführung beschleunigt.
Aber nur auf einem 64Bit-System. Bei einem 32Bit-System ist ja der Zugriff auf 4-Byte-Grenzen genauso schnell.

Auch nicht grundsätzlich. Auf einem 64-Bit System wird immer mit einem Lesezugriff 8 Bytes gelesen. Wenn er nun das darauf folgende 4 Byte Konstrukt anspricht, dann liegt dieses schon im Cache und muss nicht gelesen werden.

Auch ist durch den Dual Channel Modus das auslesen von 8 Bytes mit einem Lesezyklus schon heute bei 32 Bit Systemen verbreitet.

Zitat:

Zitat von Chewie
Wie sieht das aber aus bei einem 64Bit-System, was im 32-Bit-Modus betrieben wird (was ja bei modernen Rechnern der übliche Fall sein dürfte)? Ist in diesem Fall ein "Speicherwort" 32 oder 64 Bit groß?

Die CPU kann immerncoh die 32 Bit Syntax ausführen, die Hardwareanbindung ist aber trotzdem 64 Bit und somit wird auch alles 64 Bit angesprochen. Von der Sicht des Kompilats ist es 32 Bit (da es so kompiliert wurde), das System macht daraus aber einen 64 Bit Zugriff (was mit ignorieren des halben Datenanteils wieder durch den Cache Lesezyklen spart).


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz