AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Record vs. Packed Record, Delphi6 vs. D2007
Thema durchsuchen
Ansicht
Themen-Optionen

Record vs. Packed Record, Delphi6 vs. D2007

Ein Thema von Tyrael Y. · begonnen am 30. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#1

Record vs. Packed Record, Delphi6 vs. D2007

  Alt 30. Nov 2007, 09:28
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?
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 30. Nov 2007, 09:33
bei einem Alignment von 1 wären ja alle record packed.
8 bedeutet auf Bytegrenzen ausrichten.
Markus Kinzler
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 30. Nov 2007, 09:35
...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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 30. Nov 2007, 09:38
Ja.
Markus Kinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

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

  Alt 30. Nov 2007, 10:23
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.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 30. Nov 2007, 10:26
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ß?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 30. Nov 2007, 10:31
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

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

  Alt 30. Nov 2007, 10:46
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 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).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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