クラスと構造体には、整数型よりも記憶領域の占有率が少ないメンバーを含めることができます。 これらのメンバーは、ビット フィールドとして指定されます。 bit-field member-declarator 指定の構文は次のとおりです。
構文
宣言子 : constant-expression
解説
宣言子 (省略可能) は、プログラム内でメンバーにアクセスするために使用される名前です。 整数型 (列挙型を含む) である必要があります。 constant-expression は、構造体内でメンバーが占有するビット数を指定します。 匿名ビット フィールド (つまり、識別子のないビット フィールド メンバー) はパディング用に使用できます。
Note
名前のない幅 0 のビット フィールドは、次のビット フィールドの割り当てが次の 型 境界になるように強制します。型 はメンバーの型です。
次の例では、ビット フィールドを持つ構造体を宣言します。
// bit_fields1.cpp
// compile with: /LD
struct Date {
unsigned short nWeekDay : 3; // 0..7 (3 bits)
unsigned short nMonthDay : 6; // 0..31 (6 bits)
unsigned short nMonth : 5; // 0..12 (5 bits)
unsigned short nYear : 8; // 0..100 (8 bits)
};
Date
型のオブジェクトの概念的なメモリ レイアウトを次の図に示します。
32 ビットのメモリが 1 行に表示されます。 最下位ビットから始まる 3 ビットが、nWeekDay 用です。 次の 6 ビットは nMonthDay 用です。 次の 5 ビットは nMonth 用です。 次の 2 ビットは使用されません。 次の 8 ビットは nYear 用です。 残りの 8 ビットは使用されません。
nYear
は 8 ビット長で、宣言されている unsigned short
型のワード境界をオーバーフローすることがあります。 したがって、新しい unsigned short
の先頭から開始します。 すべてのビット フィールドが基になる型の 1 つのオブジェクトに収まる必要はありません。宣言で要求されたビット数に従って、ストレージの新しい単位が割り当てられます。
Microsoft 固有の仕様
ビット フィールドとして宣言されたデータの順序は、前の図に示すように、下位から上位のビットへ向います。
Microsoft 固有の仕様はここまで
構造体の宣言に、次の例のように、名前の付いていない長さが 0 のフィールドが含まれている場合、
// bit_fields2.cpp
// compile with: /LD
struct Date {
unsigned nWeekDay : 3; // 0..7 (3 bits)
unsigned nMonthDay : 6; // 0..31 (6 bits)
unsigned : 0; // Force alignment to next boundary.
unsigned nMonth : 5; // 0..12 (5 bits)
unsigned nYear : 8; // 0..100 (8 bits)
};
メモリ レイアウトは次の図のようになります:
64 ビットのメモリが 1 行に表示されます。 最下位ビットから始まる 5 ビットが、n Month 用です。 次の 8 ビットは n Year 用です。 次の 19 ビットは使用されません。 次の 3 ビットは n WeekDay 用です。 次の 6 ビットは n MonthDay 用です。 残りのビットは使用されません。
ビット フィールドの基になる型は組み込み型で説明されているように、整数型である必要があります。
const T&
型の参照の初期化子が T
型のビット フィールドを参照する左辺値の場合、参照はビット フィールドに直接バインドできません。 代わりに、参照は、ビット フィールドの値を保持するために一時的に初期化されたものにバインドされます。
ビット フィールドの制約
次の一覧は、ビット フィールドの不適切な操作を詳述します。
ビット フィールドのアドレスの取得。
ビット フィールドでの非
const
参照の初期化。