Autor Beitrag
reimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: Mi 25.02.04 13:43 
hi,

wie weise ich den Kompiler unter Delphi an die Variablen eines Records im Speicher hintereinander abzulegen

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden 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;

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden volle Höhe 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...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
reimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: 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