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 型のオブジェクトの概念的なメモリ レイアウトを次の図に示します。
データ オブジェクトのメモリ レイアウト
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)
};
その後、メモリレイアウトは次の図のようになります。
長さ 0 のビット フィールドを持つデータ オブジェクトのレイアウト
ビットフィールドの基になる型は、「 組み込み型」で説明されているように、整数型である必要があります。
型の参照の初期化子 const T& が型のビットフィールドを参照する左辺値の場合 T 、その参照はビットフィールドに直接バインドされません。 代わりに、この参照は、ビットフィールドの値を保持するために、一時的に初期化されたにバインドされます。
ビット フィールドの制約
次の一覧は、ビット フィールドの不適切な操作を詳述します。
ビット フィールドのアドレスの取得。
constビットフィールドを使用した非参照の初期化。