位域和结构体异同辨析

位域部分参考自:CPlusPlusThings: https://github.com/Light-City/CPlusPlusThings 镜像 一个适合初学者的从入门到进阶的仓库,里面包含了大量 C++语言的基础和进阶教程、源码剖析、工具推荐、实战练习等等,解决了初学者从入门到深入 C++的学习问题。 (gitee.com)

位域与结构体的定义看起来很相似,其实就多了一个冒号。位域可以人为规定数据长度,适合用于优化数据结构。缺点是:

  • 位域在内存中的布局是与机器有关的
  • 位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定
  • 取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域

定义:

struct stuff 
{
	unsigned int field1: 30; // field1的长度30bit
	unsigned int field2: 4;
	unsigned int field3: 3;
}; // 总共34bits, 存在2个字节中,此处1Bite=32bit
// field1与 field2 加起来一共34bit,大于一个字节,因此field1独自占一个字节,剩下的field2和filed3占一个字节

其中有两个特殊的写法:

struct stuff 
{
	unsigned int field1: 30;
	unsigned int       : 2;  // 2个bit的占位
	unsigned int field2: 4;
	unsigned int       : 0;  // 填满现在所在的字节,让field3到下一个字节中去
	unsigned int field3: 3; 
};  // 现在一共有3个字节

结构域的写法:

struct box {
    unsigned int ready;
    unsigned int error;
    unsigned int command;
    unsigned int sector_no;
}b1;

结构域可以自由的使用指针,引用等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值