Lavorare in C11, il seguente struct:Un errore in attuazione GCC di bit-field
struct S {
unsigned a : 4;
_Bool b : 1;
};
ottiene spiegate da GCC come un unsigned
(4 byte) di cui vengono utilizzati 4 bit, seguito da un _Bool
(4 byte) di cui viene utilizzato 1 bit, per una dimensione totale di 8 byte.
Si noti che C99 e C11 consentono in particolare _Bool
come membro del campo di bit. Lo standard C11 (e probabilmente anche C99) afferma anche sotto §6.7.2.1 'Struttura e unione prescrittori' ¶11 che:
L'attuazione può allocare qualsiasi unità di memorizzazione indirizzabile abbastanza grande da contenere un po 'campo. Se rimane abbastanza spazio, un campo di bit che segue immediatamente un altro campo di bit in una struttura deve essere impacchettato in bit adiacenti della stessa unità.
Quindi ritengo che l'organo b
sopra avrebbe dovuto essere confezionato nel contenitore allocata per il membro a
, risultando in una struttura di dimensione totale di 4 byte.
GCC comporta correttamente e l'imballaggio si verifica quando si utilizzano gli stessi tipi per i due membri, o quando si è unsigned
e l'altra signed
, ma i tipi unsigned
e _Bool
sembrano essere considerate troppo distinta da GCC perché gestirli correttamente.
Qualcuno può confermare la mia interpretazione dello standard e che questo è davvero un bug GCC?
Sono anche interessato a un work-around (alcuni switch del compilatore, pragma, __attribute__
...).
sto usando gcc 4.7.0 con -std=c11
(anche se altre impostazioni mostrano lo stesso comportamento.)
Si noti che l'estensione GCC '__attribute__ ((packed))' può essere applicata ai membri qui , ma è ortogonale a questo problema (risulta in una struttura di dimensione 4 + 1 = 5, vale a dire con lo stesso problema). – ndkrempel
Correlati: http://stackoverflow.com/questions/308364/c-bitfield-packing-with -bools (ma si riferisce a C++, che non è altrettanto impegnativo nella sua formulazione sui campi di bit). – ndkrempel
In base a una risposta alla domanda collegata sopra, questo comportamento non si è verificato in gcc 4.2.4, quindi potrebbe essere una regressione da allora. – ndkrempel