C++ 位元欄位
類別和結構可包含比整數型別佔用較少儲存區的成員。 這些成員指定為位元欄位。 位元欄位 成員宣告子 規格中的語法如下:
declarator : constant-expression
備註
(選擇性) declarator 是成員在程式存取的名稱。 它必須是整數類資料型別 (包括列舉型別)。 constant-expression 指定成員在結構佔用的位元組數目。 匿名位元欄位 ( 亦即沒有識別項的位元欄位成員 ) 可用來填補。
注意事項 |
---|
未命名的位元欄位寬度 0 會強制對齊下一位元欄位至下一個 type 界限,此 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 物件的概念性記憶體配置如下圖所示。
Date 物件的記憶體配置
請注意 nYear 長度為 8 位元且會造成宣告型別 unsigned short 的字邊界溢位。 因此,它會在新 unsigned short 的開頭處開始。 不需要所有位元欄位都調整至基礎型別的物件中;儲存的新單位根據宣告所要求的位元組數目被配置。
Microsoft 專有的
為位元欄位宣告的資料之順序是由低至高位元,如上面的圖所示。
END 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)
};
記憶體配置如下圖所示。
具有長度為零之位元欄位的 Date 物件配置
位元欄位的基底型別必須是整數類資料型別,如 基本型別中所述。