位域 (bit-field)
位域(bit-field)也叫位段。所谓"位域",实际上就是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。其主要优点当然就是节省内存了~
在C++中,类可以将其(非静态)数据成员定义为位域,在一个位域中含有一定数量的二进制位。当一个程序需要向其他程序或硬件设备传递二进制数据时,通常会用到位域。
需要注意:
- 位域在内存中的布局是与机器有关的
- 位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定
- 取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域
#include using namespace std;#pragma pack(push) // 保存对齐状态
#pragma pack(4) // 设定4字节对齐
struct test
{uint32_t ws:1; // 只需要使用1位uint32_t hs:2; // 需要使用2位
};#pragma pack(pop) // 恢复对齐状态int main()
{// 这里注意结构体或类中存在位域时的大小// 以本文中的test为例,test中两个位域成员,一个占1位,另一个占2位,而我们设定// 结构体对齐方式是4字节(即32位),显而易见并没有超出最小对齐单元的大小,因此// 结构体test的大小是4cout << sizeof(test) << endl; // 4test* test_arr = (test*)malloc(sizeof(test)*4);(*(test_arr+0)).ws |= 1; // ws占1位,最大10进制可表示1(0x1)cout << (test_arr+0)->ws << endl;(*(test_arr+0)).hs = 3; // hs占两位,最大10进制克表示3(0x11)cout << (test_arr+0)->hs << endl;(*(test_arr+0)).hs = 4;cout << (test_arr+0)->hs << endl; // 超出位域,值为0free(test_arr);test_arr = NULL;return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
