Das hängt mit dem Memory Alignment zusammen. Wenn du eine 32-Bit CPU hast, hast du normalerweise auch einen 32-Bit Datenbus zum Arbeitsspeicher. Um Daten aus dem Arbeitsspeicher zu bekommen, muss die CPU also ein Offset angeben und bekommt dann die 32 Bit an dieser Position im Arbeitsspeicher. Aber dieses Offset ist nicht Byte-weise, sondern Registergrößen-weise. Das heißt an Offset 0 stehen die ersten 32 Bit, an Offset 1 die nächsten 32 Bit, usw.
Wenn man eine Struktur dann so aufbaut, dass jedes Element genau der Registergröße entspricht, dann ist es ein leichtes an diesen Wert zu kommen.
Hättest du jetzt allerdings eine Struktur mit dem Aufbau "short, long", dann wäre die Verteilung ohne Alignment im Speicher so:
Code: Alles auswählen
Offset 0 1
Byte 0 1 2 3 4 5
aaaa aaaa bbbb bbbb bbbb bbbb
a = short
b = long
Will jetzt die CPU b auslesen, müsste sie zuerst den Wert an Offset 0 auslesen, dann an Offset 1 und die beiden Werte dann shiften und ver-ODER-n, damit es ihn im Register liegen hat.
Mit MemoryAlignment wird alles schon vorher richtig gerückt.
Code: Alles auswählen
Offset 0 1
Byte 0 1 2 3 4 5 6 7
aaaa aaaa ???? ???? bbbb bbbb bbbb bbbb
a = short
b = long
Die Variable a liegt an Offset 0 und Variable b an Offset 1. Mit einem Rutsch sind die dann ausgelesen.