C++ 位域
类和结构可包含比整型类型占用更少存储空间的成员。 这些成员被指定为位域。 位字段成员声明符的语法如下所示:
语法
声明符 : 常量表达式
备注
(可选)声明符是在程序中访问该成员时所依据的名称。 它必须是整型类型(包括枚举类型)。 常数表达式指定成员在结构中所占用的位数。 匿名位域 — 即不带标识符的位域成员,可用于填充。
备注
宽度为0的未命名位域强制将下一个位域与下一个类型边界对齐,其中type是成员的类型。
下面的示例声明包含位域的结构:
C++复制
// 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
。 并不必使所有位域均适合基础类型的对象;根据声明中请求的位数来分配新的存储单元。
Microsoft 专用
声明为位域的数据从低位到高位进行排序,如上图所示。
结束 Microsoft 专用
如果结构的声明包含长度为 0 的未命名字段(如以下示例所示),
C++复制
// 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)
};
然后,内存布局如下图所示:
带有零长度位域的数据对象的布局
位域的基础类型必须是整型,如内置类型中所述。
如果类型引用的初始值设定项 const T&
是引用类型的位域的左值 T
,则引用不会直接绑定到位域。 相反,引用绑定到一个临时初始化的,以容纳位域的值。
位域的限制
以下列表详述了位域的错误操作:
另请参阅
-
采用位域的地址。
-
const
使用位域初始化非引用。