Błąd w implementacji GCC pól bitowych

Pracując w C11, następująca struktura:

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

Dostaje GCC jakounsigned (4 bajty), z których używane są 4 bity, a następnie a_Bool (4 bajty), z czego 1 bit jest używany, dla całkowitego rozmiaru 8 bajtów.

Zauważ, że C99 i C11 wyraźnie na to pozwalają_Bool jako członek pola bitowego. Standard C11 (i prawdopodobnie również C99) stwierdza również w §6.7.2.1 „Struktura i specyfikatory unii” 11, że:

Implementacja może przydzielić dowolną adresowalną jednostkę pamięci wystarczająco dużą, aby pomieścić pole bitowe. Jeśli pozostanie wystarczająca ilość miejsca, pole bitowe, które następuje bezpośrednio po innym polu bitowym w strukturze, zostanie zapakowane w sąsiednie bity tej samej jednostki.

Więc wierzę, że członekb powyżej powinny być zapakowane do jednostki pamięci przydzielonej członkowia, co daje strukturę o całkowitym rozmiarze 4 bajty.

GCC zachowuje się poprawnie, a pakowanie ma miejsce, gdy używa się tych samych typów dla dwóch członków lub gdy jestunsigned i innisigned, ale typyunsigned i_Bool wydaje się, że GCC uważa, że ​​jest zbyt odmienny, aby mógł je poprawnie obsługiwać.

Czy ktoś może potwierdzić moją interpretację standardu i że jest to rzeczywiście błąd GCC?

Interesuje mnie także obejście (jakiś przełącznik kompilatora, pragma,__attribute__...).

Używam gcc 4.7.0 z-std=c11 (chociaż inne ustawienia pokazują to samo zachowanie).

questionAnswers(2)

yourAnswerToTheQuestion