Compiler typischerweise nachlauf Polsterung auf Strukturen einzufügen Ausrichtung Einschränkungen zu erfüllen, wenn sie in Arrays verwendet:Nachlauf padding in interne Struktur
// Size 4, alignment 2
struct A {
uint16_t x;
uint8_t y;
// Padding 1 byte
};
// Size 6, alignment 2
struct B {
struct A xy;
uint8_t z;
// Padding 1 byte
};
Nun Kombination dieser mit internen Struktur berücksichtigen:
struct AB {
struct {
uint16_t x;
uint8_t y;
} xy;
uint8_t z;
};
Folgendes könnte in 4 Bytes passen, während die Ausrichtungsbeschränkungen nicht verletzt werden. Auch interne Struktur xy
hat keinen Typ, der an anderer Stelle verwendet werden könnte, so Trailing Padding für es ist nicht erforderlich.
Nachteil ist, dass Mitglied xy
wäre inkompatibel mit struct A
, aber es ist kein Grund, warum es so sein sollte, wie sie in verschiedenen Typdefinitionen sind.
Kann der Compiler diese Größenoptimierung durchführen?
Oder anders ausgedrückt, verlangt der Standard, dass 2 Strukturen mit gleichen Elementen immer zu gleichem Layout führen?
Ich denke, dass der Compiler dies tun würde, da der Standard den Compiler nicht benötigt, um Strukturen zu puffern. – qbt937