Mathias hat geschrieben:Ich dachte immer, das ein ganzer 32bit Wert für ein Byte reserviert wird, bei einem 32Bit Betriebssystem.
Für eine Variable von einem Byte große wird nur dann 32 Bit benötigt, wenn die 3 restlichen Bytes nicht mit passenden Variablen von maximal 3 Byte Größe belegt werden können. Bei einem array of Byte werden diese einfach nur aneinander gereiht, da wird kein Platz verschwendet, der gepackt werden kann.
Ich denke, dass records die Sache besser verdeutlichen:
Code: Alles auswählen
program Project1;
type
ta = record
x: byte; // An 32 Bit ausgerichtet
y: ptrint; // 32 bit - muss nicht ausgerichtet werden, da x bereits ausgerichtet
z: byte; // nochmals an 32 Bit ausgerichtet
end;
tap = packed record // hier ist nichts ausgerichtet
x: byte;
y: ptrint;
z: byte;
end;
tb = record
x: byte; // An 32 Bit ausgerichtet
z: byte; // passt ebenfalls hinein
y: ptrint;// wieder 32 Bit
end;
tbp = packed record // hier ist nichts ausgerichtet
x: byte;
z: byte;
y: ptrint;
end;
begin
WriteLn(Sizeof(ta)); // 12 Byte
WriteLn(Sizeof(tap)); // 6 Byte
WriteLn(sizeof(tb)); // 8 Byte
WriteLn(sizeof(tbp)); // 6 Byte
readln;
end.