struct A
{
uint32_t var1;
uint32_t var2;
uint32_t var3;
uint32_t var4;
uint32_t var5;
};
In der oben genannten Struktur nicht Compiler nicht auffüllen und weist 20 Bytes.Struktur Padding auf 64-Bit-Maschine
jetzt haben wir eine andere Struktur, die eine 8-Byte-Variable anstelle von zwei 4 Bytes enthält. In diesem Fall packt Compiler und weist dieser Struktur 24 Bytes zu.
struct B
{
uint32_t var1;
uint32_t var2;
uint32_t var3;
uint64_t var5;
};
Warum gibt es ein solches Verhalten? Wenn der Compiler die Daten in 8-Byte-Grenzen ausrichtet, dann sollte in der 1. Struktur ein Padding von 4 Bytes vorhanden sein, und in diesem Fall sollte die 2. Struktur nicht auffüllen. und auch, wenn Compiler die Daten in die 4-Byte-Grenze ausrichten, warum gibt es Padding von 4 Byte in der 2. Struktur?
Compiler GCC Plattform: 64-Bit-Linux, x86_64
Die Ausrichtung Anforderung der Struktur ist die Ausrichtung des Elements mit der strengsten Ausrichtung Anforderung. Auf Ihrer C-Implementierung hat 'uint64_t' strengere Anforderungen als 'uint32_t'. – EOF
Mögliches Duplikat von [Warum benötigt ein uint64 \ _t bei Verwendung in einer Klasse mehr Speicher als 2 uint32 \ _t? Und wie kann man das verhindern?] (Http://stackoverflow.com/questions/26381206/why-does-an-uint64-t-needs-more-memory-than-2-uint32-ts-when-usedin-in- a-class-a) – Mars
Ohne Padding würde der Uint64_t bei Offset 12 beginnen. Das verschiebt es falsch, kein Vielfaches von 8, also fügt der Compiler 4 Byte Padding ein, um es auf Offset 16 zu bringen. 16 + 8 = 24. Es ist kein zusätzliches Padding erforderlich, es ist immer noch ausgerichtet, wenn es in einem B [] gespeichert ist, also ist 24 gut genug. –