normy (9.6 the working draft) mówi, to:
określa dla pola; jego długość jest wybierana z nazwy pola bitowego przez dwukropek. Atrybut pola bitowego nie należy do typu klasy . Stała ekspresja musi być stałą wartością stałą o wartości większej lub równej zeru. Stała ekspresja może być większa niż liczba bitów w reprezentacji obiektów typu ( 3.9) typu pola bitowego; w takich przypadkach dodatkowe bity są używane jako bity dopełniające i nie uczestniczą w reprezentacji wartości pola bitowego ( 3.9). Przydział pól bitowych w obiekcie klasy jest definiowany przez implementację. Wyrównanie pól bitowych to zdefiniowane przez implementację. Pola bitowe są zapakowane w jakąś adresowalną jednostkę alokacji . [Uwaga: Jednostki alokacji bitów na niektórych maszynach , a nie na innych. Pola bitowe są przypisywane od prawej do lewej na niektórych maszynach, od lewej do prawej na innych. -end uwaga]
(podkreślenie moje)
Więc to zależy od kompilatora. To, co zdarza się w twoim przypadku - a opisałbym to jako dość normalne zachowanie - polega na tym, że łączy tylko pola bitowe tego samego typu, a następnie pakuje strukturę do granicy 4-bajtowej, więc w pierwszym przypadku mamy:
struct a {
uint32_t foreColor_ : 32; // 4 bytes (total)
uint32_t backColor_ : 32; // 8 bytes
uint16_t lfHeight_ : 16; // 10 bytes
uint16_t flags_: 4; // 12 bytes
bool lfBold_: 1; // 13 bytes
bool lfItalic_: 1;
bool lfUnderLine_: 1;
bool lfDashLine_: 1;
bool lfStrike_: 1;
bool lfSubscript_: 1;
bool lfSuperscript_: 1; // still 13 bytes
};
który jest następnie wypełnione do 16 bajtów, a po drugie mamy:
struct a {
uint32_t foreColor_ : 32; // 4 bytes (total)
uint32_t backColor_ : 32; // 8 bytes
uint16_t lfHeight_ : 16; // 10 bytes
uint8_t flags_: 4; // 11 bytes
bool lfBold_: 1; // 12 bytes
bool lfItalic_: 1;
bool lfUnderLine_: 1;
bool lfDashLine_: 1;
bool lfStrike_: 1;
bool lfSubscript_: 1;
bool lfSuperscript_: 1; // still 12 bytes
};
który wymaga żadnej wyściółki i pozostaje na 12 bajtów.
Czy używanie typów takich jak 'uint32_t' dla pola bitowego nie jest zbyt głupie? (Zwykle powinny być używane tylko wtedy, gdy trzeba dokładnie dopasować format zewnętrzny, a nawet wtedy ich użycie jest wątpliwe.) –