CPP 位域

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 类型的对象的概念上的内存布局如下图所示。

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

然后,内存布局如下图所示:

具有零-长度位域的 Date 对象的布局
带有零长度位域的数据对象的布局

位域的基础类型必须是整型,如内置类型中所述。

如果类型引用的初始值设定项 const T& 是引用类型的位域的左值 T ,则引用不会直接绑定到位域。 相反,引用绑定到一个临时初始化的,以容纳位域的值。

位域的限制

以下列表详述了位域的错误操作:

另请参阅

类和结构

  • 采用位域的地址。

  • const 使用位域初始化非引用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值