C++ ビット フィールド

クラスと構造体には、整数型よりも記憶領域の占有率が少ないメンバーを含めることができます。 これらのメンバーは、ビット フィールドとして指定されます。 ビットフィールド メンバー宣言子 の指定の構文は次のとおりです。

構文

宣言子:定数式

解説

(省略可能) 宣言子 は、プログラム内でメンバーにアクセスするときに使用する名前です。 整数型 (列挙型を含む) である必要があります。 定数式は、メンバーが構造体で占有するビット数を指定します。 匿名のビットフィールドで — ある、識別子のないビットフィールドメンバーは、 — 埋め込みに使用できます。

注意

名前のないビットフィールド width 0 は、次のビットフィールドを次の 境界に強制的にアラインメントします。ここで、 type はメンバーの型です。

次の例では、ビット フィールドを持つ構造体を宣言します。

// 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 型のオブジェクトの概念的なメモリ レイアウトを次の図に示します。

Memory layout of a date object, showing the nWeekDay, nMonthDay, nMonth, and nYear bit fields.
データ オブジェクトのメモリ レイアウト

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)
};

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

Layout of a Date object with a zero length bit field, which forces alignment padding.
長さ 0 のビット フィールドを持つデータ オブジェクトのレイアウト

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

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

ビット フィールドの制約

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

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

  • constビットフィールドを使用した非参照の初期化。

関連項目

クラスと構造体