共用方式為


C++ 位元欄位

類別和結構可包含比整數類型佔用較少儲存區的成員。 這些成員指定為位元欄位。 位元欄位 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 類型物件的概念性記憶體配置如下圖所示:

日期物件的記憶體配置圖表,其中顯示 n WeekDay、n MonthDay、n Month 和 n Year 位元欄位所在的位置。

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

接著,記憶體配置如下圖所示:

Date 物件的配置圖表,其長度為零的位元欄位,會強制對齊邊框間距。

64 位元的記憶體會顯示在資料列中。 從最小有效位元開始,5 位元適用於 n Month。 接下來的 8 位元適用於 n Year。 接下來的 19 位元未使用。 接下來的 3 位元適用於 n WeekDay。 接下來的 6 位元適用於 n MonthDay。 其餘的位元未使用。

位元欄位的基礎類型必須是整數類資料類型,如內建類型中所述。

如果類型 const T& 參考的初始設定式是參考類型 T 的位元欄位的左值,則參考不會直接繫結至位元欄位。 相反地,參考會繫結至暫時初始化,以保留位元欄位的值。

位元欄位的限制

下列清單詳細說明位元欄位的錯誤作業:

  • 取得位元欄位的位址。

  • 使用位元欄位初始化非const 參考。

另請參閱

類別和結構