類別和結構可包含比整數類型佔用較少儲存區的成員。 這些成員指定為位元欄位。 位元欄位 member-declarator 規格的語法如下:
語法
declarator : constant-expression
備註
(選擇性) declarator 是在程式中用來存取成員的名稱。 它必須是整數類資料類型 (包括列舉類型)。 constant-expression 指定結構中成員所佔用的位元數目。 匿名位元欄位 (亦即沒有識別項的位元欄位成員) 可用於填補。
注意
未命名且寬度 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 位元的記憶體會顯示在資料列中。 從最小有效位元開始,3 位元適用於 nWeekDay。 接下來的 6 位元適用於 nMonthDay。 接下來的 5 位元適用於 nMonth。 接下來的 2 位元未使用。 接下來的 8 位元適用於 nYear。 其餘 8 位元未使用。
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)
};
接著,記憶體配置如下圖所示:
64 位元的記憶體會顯示在資料列中。 從最小有效位元開始,5 位元適用於 n Month。 接下來的 8 位元適用於 n Year。 接下來的 19 位元未使用。 接下來的 3 位元適用於 n WeekDay。 接下來的 6 位元適用於 n MonthDay。 其餘的位元未使用。
位元欄位的基礎類型必須是整數類資料類型,如內建類型中所述。
如果類型 const T&
參考的初始設定式是參考類型 T
的位元欄位的左值,則參考不會直接繫結至位元欄位。 相反地,參考會繫結至暫時初始化,以保留位元欄位的值。
位元欄位的限制
下列清單詳細說明位元欄位的錯誤作業:
取得位元欄位的位址。
使用位元欄位初始化非
const
參考。