ビットフィールドを含む型のサイズに関して、標準は次のように述べています (C11 6.7.2.1 p11):
実装では、ビットフィールドを保持するのに十分な大きさのアドレス可能なストレージユニットを割り当てることができます。
これは でありunion
、ユニオン内のすべてのメンバーは から 3 ビット以下しか使用しないためunsigned int
、 のサイズはunion
少なくとも if のサイズchar
に、システムで必要なパディング (存在する場合) を加えたものになります。union
多くのシステムでは、ビットフィールドが取得される型のサイズに合わせて各ユニットがパディングされるため、この場合、 のサイズはのサイズと同じであると予想されますunsigned int
(ただし、union
とにかく通常のパディング要件に)。
サイズ化された0
ビットフィールドは aでは厄介union
ですが、a では特別な意味がありますstruct
(C11 6.7.2.1 p12):
宣言子がなく、コロンと幅のみのビットフィールド宣言は、名前のないビットフィールドを示します。特殊なケースとして、幅が 0 のビットフィールド構造体メンバーは、前のビットフィールドが配置されていたユニットにそれ以上ビットフィールドをパックしないことを示します。
したがって、あなたunion
がstruct
代わりにだった場合:
struct d
{
unsigned int a:1;
unsigned int b:3;
unsigned :0;
unsigned int d:1;
unsigned int e:1;
};
その場合、これのサイズはstruct
少なくとも 2char
秒になります (必要に応じて他のパディングも追加されます)。ほとんどの場合、実際には 2unsigned int
秒のサイズになります。