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