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).