Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - records / speicher / sizeof
reimo - Mi 25.02.04 13:43
Titel: records / speicher / sizeof
hi,
wie weise ich den Kompiler unter Delphi an die Variablen eines Records im Speicher hintereinander abzulegen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TRec = record var1: Byte; var2: Byte; var3: DWord; var4: Word; var5: Word; end;
... var x:TRec;
x.var1 := $12; x.var2 := $34; x.var3 := $56789012; x.var4 := $3333; x.var5 := $4444; |
Im Speicher sieht es wie Folgt aus: 12 34
00 00 12 90 78 56 .....
Ich möchte aber, dass das DWord an den beiden Bytes gleich anschliesst: 12 34
12 90 78 56
danke,
reimo
Motzi - Mi 25.02.04 14:02
Standardmäßig richtet Delphi die Felder eines Record automatisch an Speichergrenzen aus. Daher werden (wie du bereits bemerkt hast) teilweise Fillerbytes eingeschoben. Das ganze kannst du mit einem packed record verhindern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| type TRec = packed record var1: Byte; var2: Byte; var3: DWord; var4: Word; var5: Word; end; |
Delete - Mi 25.02.04 14:11
Man sollte eventuell noch Vor- und Nachteile erwähnen. Mit packed sparst du zwar Platz aber die Performance sinkt. Ohne packed verhält es sich genau umgekehrt. Liegt daran, dass immer 32-Bit hinundher geschoben werden.
Motzi - Mi 25.02.04 14:18
Richtig.. wobei die Geschwindigkeitsunterschiede bei vereinzelten Zugriffen aber nicht so sehr ins Gewicht fallen dürften.... Als Alternative kann man, statt den Record als packed zu deklarieren, versuchen die Felder des Records ein bisschen herumzuschieben, sodass jedes an seiner Speichergrenze ausgerichtet ist. Bei deinem Record gäbe es da verschiedene Möglichkeiten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| type TRec = record var1: DWord; var2: Byte; var3: Byte; var4: Word; var5: Word; end;
TRec = record var1: Byte; var2: Byte; var3: Word; var4: DWord; var5: Word; end;
TRec = record var1: Word; var2: Word; var3: DWord; var4: Byte; var5: Byte; end;
TRec = record var1: Word; var2: Byte; var3: Byte; var4: DWord; var5: Word; end; |
Es gibt wahrscheinlich auch noch ein paar andere Möglichkeiten, aber ich denke das reicht erstmal...
reimo - Mi 25.02.04 14:52
hi
danke für die Antworten, werds mit packed ausprobieren!
die Record-Members kann ich nicht leider nicht anders anordnen, da die Reihenfolge vorgegeben ist!
thx
reimo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!