Autor Beitrag
handson
Hält's aus hier
Beiträge: 5

Win XP, Linux
Delphi 7 Prof.
BeitragVerfasst: Di 25.07.06 08:45 
Hallo!

Ich benutze hier Delphi 7 Prof. und hab' mal eine Frage zur Speicherbelegung eines Records.
Das Record ist wie folgt unter Delphi deklariert:

ausblenden Quelltext
1:
2:
3:
4:
5:
Type
  TTest = Record
    var1 : Char;
    var2 : SmallInt;
  End;


Wenn ich jetzt mittels der Funktion SizeOf() die Größe des Records rauskriegen möchte, zeigt er 4 Bytes an. Das wundert mich ein wenig, denn Char sind 8 Bit und SmallInt 16 Bit groß. Das macht 24 Bit, also 3 Bytes. Woher kommen die restlichen 8 Bits??

Wenn ich das ganze unter Borland Pascal 7 machen, allerdings statt SmallInt, den Integer benutzer, dann kriege ich meine 3 Byte raus.

Das eigentlich Problem ist, dass ich eine Datei mittels BlockRead in Delphi lesen möchte, die unter BP 7 erstellt worden ist. Nachdem ich das Record in Delphi umgestellt habe, kamen da immer noch 24 Bytes zu viel raus und das Lesen hat natürlich nicht funktioniert.

Hat jemand da eine plausible Erklärung für mich?

Vielen Dank im voraus!

Stephan
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 25.07.06 08:57 
Moin und :welcome: im Forum!

Der Delphi-Compiler "erlaubt" sich, das Speicherabbild einer Verbunddatenstruktur so zu optimieren, dass der Zugriff möglichst einfach und schnell geht.

Wenn du das record auf kleinst möglichem Raum haben willst, mußt du noch das Schlüsselwort "packed" dransetzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type  
  TTest = packed record
    var1: Char;  
    var2: SmallInt;  
  end;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 25.07.06 08:58 
Ich kenne das Phänomen.
Um den Speicherzugriff zu optimieren (Geschwindigkeit), werden die Elemente des Records an Word-Grenzen ausgerichtet. Da dein Char aber nur ein Byte ist, wird einfach leerer Speicherplatz produziert, damit das nächste Element wieder an einer Word-Grenze beginnt. Das ist dann genau ein Byte mehr.

Beheben kannst du das mit dem Schalter für "Felder ausrichten".
Zitat aus der OH:
Zitat:
Die Direktive $A steuert die Ausrichtung von Feldern in Record-Typen.c
Im Status {$A+} werden diejenigen Felder in Record-Typen ausgerichtet, die ohne den Bezeichner packed deklariert wurden. Im Status {$A-} werden keine Felder ausgerichtet. Die Ausrichtung von Feldern in Record-Typen wird in der Object Pascal Sprachreferenz beschrieben.
Variablen und typisierte Konstanten werden unabhängig von der Direktive $A immer für einen optimalen Zugriff ausgerichtet. Der Status {$A+} beschleunigt die Ausführung.
handson Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, Linux
Delphi 7 Prof.
BeitragVerfasst: Di 25.07.06 10:44 
Hi!

Vielen Dank für die schnelle Antwort!
Hat jetzt geklappt! Prima!

Stephan
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 25.07.06 10:53 
Wie bereits fügt der Compiler diese Padding-Bytes ein, damit die Felder des Records an ausgerichteten Adressen liegen. Wie du dem Compiler klar machst, dass er das nicht tun soll wurde auch schon erklärt, die bessere Methode ist aber (falls möglich) die Reihenfolge Felder des Records anzupassen. In deinem Fall wäre es zB besser den Record so anzulegen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TTest = packed record
    var2 : SmallInt;
    var1 : Char;
  end;

Wenn man das "packed" weglässt ist er zwar wieder 4 Bytes groß, jedoch sind alle Felder auch dann ausgerichtet wenn man ihn als "packed record" deklariert. Ausnahme wäre ein Array, wo alle Records hintereinander im Speicher liegen. Da wäre jeder zweite Record an einer nicht ausgerichteten Adresse...

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!