compilatori tipicamente inserire trascinamento imbottitura strutture per soddisfare allineamento restrizioni quando sono usati in array:trascinamento imbottitura in struttura interna
// 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
};
Ora consideriamo combinazione di questi struttura interna utilizzando:
struct AB {
struct {
uint16_t x;
uint8_t y;
} xy;
uint8_t z;
};
Di seguito potrebbe rientrare in 4 byte, senza tuttavia rompere le restrizioni di allineamento. Inoltre, la struttura interna xy
non ha alcun tipo che possa essere utilizzato altrove, quindi il riempimento finale di non è necessario.
Unico inconveniente è che gli xy
sarebbe incompatibile con struct A
, ma non vi c'è motivo per cui dovrebbe essere come sono in diverse definizioni di tipo.
Il compilatore è autorizzato a eseguire questa ottimizzazione delle dimensioni?
Oppure, per dirla in altro modo, lo standard richiede che 2 strutture con membri uguali abbiano sempre un layout uguale?
Penso che il compilatore sarebbe autorizzato a farlo, poiché lo standard non richiede al compilatore di riempire le strutture. – qbt937