Ошибка в реализации битовых полей в GCC
Работая в C11, следующая структура:
struct S {
unsigned a : 4;
_Bool b : 1;
};
GCC выкладывается какunsigned
(4 байта) из которых используются 4 бита, за которыми следует_Bool
(4 байта), из которых используется 1 бит, для общего размера 8 байтов.
Обратите внимание, что C99 и C11 специально разрешают_Bool
как член битового поля. Стандарт C11 (и, вероятно, также C99) также указывается в разделе «# 6A.2; 6». Спецификаторы структуры и объединения ». & # xB6; 11 что:
An implementation may allocate any addressable storage unit large enough to hold a bit-field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit.
Поэтому я считаю, что членb
выше должен был быть упакован в единицу хранения, выделенную для членаa
, в результате чего получается структура с общим размером 4 байта.
GCC ведет себя правильно, и упаковка происходит при использовании одних и тех же типов для двух членов, или когда одинunsigned
и другиеsigned
, но типыunsigned
а также_Bool
Похоже, что GCC считает его слишком четким, чтобы он мог правильно с ними обращаться.
Может ли кто-нибудь подтвердить мою интерпретацию стандарта, и что это действительно ошибка GCC?
Я также заинтересован в обходном пути (некоторый переключатель компилятора, прагма,__attribute__
...).
Я использую gcc 4.7.0 с-std=c11
(хотя другие настройки показывают то же самое поведение.)