位域与结构体的定义看起来很相似,其实就多了一个冒号。位域可以人为规定数据长度,适合用于优化数据结构。缺点是:
- 位域在内存中的布局是与机器有关的
- 位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定
- 取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域
定义:
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;
结构域可以自由的使用指针,引用等。