C++ ビット フィールド

クラスと構造体には、整数型よりも記憶領域の占有率が少ないメンバーを含めることができます。 これらのメンバーは、ビット フィールドとして指定されます。 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 のオブジェクトの概念的なメモリ レイアウトを次の図に示します。

Diagram of the memory layout of a date object, showing where the n WeekDay, n MonthDay, n Month, and n Year bit fields are located.

32 ビットのメモリが 1 行に表示されます。 最下位ビットから始まり、nWeekDay の場合は 3 ビットです。 次の 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)
};

その後、メモリ レイアウトは次の図のようになります。

Diagram of the layout of a Date object, with a zero length bit field, which forces alignment padding.

64 ビットのメモリが 1 行に表示されます。 下位ビットから始まり、5 ビットは n か月用です。 次の 8 ビットは n 年用です。 次の 19 ビットは使用されません。 次の 3 ビットは n WeekDay 用です。 次の 6 ビットは n MonthDay 用です。 再メインビットは使用されません。

ビット フィールドの基になる型は組み込み型で説明されているように、整数型である必要があります。

型の参照の初期化子が、型 const T& のビット フィールドを参照する左辺値である T場合、参照はビット フィールドに直接バインドされません。 代わりに、参照は、ビット フィールドの値を保持するために一時的に初期化されたものにバインドされます。

ビット フィールドの制約

次の一覧は、ビット フィールドの不適切な操作を詳述します。

  • ビット フィールドのアドレスの取得。

  • ビット フィールドでの非 const 参照の初期化。

関連項目

クラスと構造体