ビットフィールドのタイプとして使用した場合unsigned char
、サイズ 4 とサイズ 2 のそれぞれが得られます。のアラインメント、つまりサイズは、struct
通常、ビットフィールドの整数型によって決まります。特にビットフィールドを使用した構造体のパッキングは、高度に実装定義されていますが、6.7.2.1 ad 11 によって指示されています。
実装では、ビットフィールドを保持するのに十分な大きさのアドレス可能なストレージユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドを次のユニットに配置するか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。アドレス可能なストレージ ユニットのアラインメントは指定されていません。
ほとんどのコンパイラは、ビットフィールドで指定された整数型を「アドレス指定可能な記憶単位」として使用します。
構造体のパッキングは、多くの場合、アーキテクチャのアプリケーション バイナリ インターフェイス (ABI) の一部として指定され、このアーキテクチャのコンパイラの相互運用性を確保することにも注意してください。
x86 アーキテクチャ用の GCC コンパイラを想定して、例をさらに詳しく説明します。
struct
{ unsigned int a:5;
unsigned int b:5;
unsigned int c:5;
unsigned int d:5;
};
4 つのビット フィールドは、32 ビット コンテナーの最初の 20 ビットに配置されます。
struct
{ unsigned char a:5;
unsigned char b:5;
unsigned char c:5;
unsigned char d:5;
};
各ビット フィールドは独自の 8 ビット コンテナーに配置されるため、ここでも 32 ビットです。
struct
{ unsigned int a:5;
unsigned int b:5;
};
ビット フィールドは 32 ビット コンテナーの最初の 10 ビットにあるため、構造体全体は 32 ビットのままです。
struct
{ unsigned char a:5;
unsigned char b:5;
};
両方のビット フィールドはそれぞれ独自の 8 ビット コンテナーに配置されるため、構造体全体は 16 ビットです。
struct
{ unsigned char a:5;
unsigned char b:3;
unsigned char c:3;
unsigned char d:5;
unsigned char e:5;
};
ビット フィールドa
でありb
、8 ビット コンテナー内にあります。ビット フィールドc
とd
は 8 ビット コンテナーにあり、ビット フィールドe
は 8 ビット コンテナーにあり、合計で 24 ビットになります。