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