Ошибка в реализации битовых полей в 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 (хотя другие настройки показывают то же самое поведение.)

Ответы на вопрос(2)

Ваш ответ на вопрос