Ошибка в реализации битовых -полей GCC

Работая в C11, следующая структура:

struct S {
  unsigned a : 4;
  _Bool    b : 1;
};

Выложен GCC какunsigned(4 байта ), из которых используются 4 бита, за которыми следует_Bool(4 байта ), из которых используется 1 бит, всего 8 байт.

Обратите внимание, что C99 и C11 специально разрешают _Boolв качестве члена битового поля -. Стандарт C11 (и, возможно, C99 тоже )также утверждает в §6.7.2.1 «Спецификаторы структуры и объединения» §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(хотя другие настройки показывают такое же поведение.)

9
задан Jonathan Leffler 1 July 2012 в 16:59
поделиться