Timm1981 schrieb:
Ich habe gestern mal was probiert. Ich habe zwei Integers hintereinander gehabt, gefolgt von einem Double. Alle drei haben dann 16 Bytes belegt (kein Padding). Dann habe ich nur einen Integer gefolgt von einem Double genommen, beide haben ebenfalls 16 Bytes belegt mit 4 Bytes Padding dazwischen. Auf meinem System wird also scheinbar auf Doubles gepaddet. Aber das scheint systemabhängig zu sein.
Es ist Compilerabhängig.
Wenn ein System einen Standard für Compiler vorschreibt, dann ist es Systemabhängig
MSVC macht es so, dass es eine "Obergrenze" für Padding gibt (die Option nennt sich "Struct Member Alignment"). Einstallbar sind 1, 2, 4, 8 oder 16 Byte, Default ist 8 (zumindest auf 32 Bit Systemen).
Wenn MSVC jetzt ein neues Member platzieren will, dann guckt er
a) wie gross ist das Member und
b) wie hoch ist das "Struct Member Alignment"
Der kleinere dieser beiden Werte bestimmt dann das Alignment des neuen Members, und damit das Padding.
D.h. für nen einfachen int wird MSVC nie mehr als 3 Byte Padding einfügen. Für nen char überhaupt kein Padding. Und für grössere Dinge eben maximal 15 Byte.
Ich *schätze* dass es andere Compiler *vermutlich* ähnlich machen werden, genau weiss ich es aber nur vom guten alten MSVC.
p.S.: was bei Arrays gilt weiss ich grad nicht auswendig - also ob die Grösse des gesamten Arrays als "Grösse des Members" genommen wird, oder die Grösse der einzelnen Elemente des Arrays. Kann man aber auch alles in der MSDN lachlesen.