一、前言
二、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:
struct sa
{
char a:3;
char b:4;
char c:1;
};
三、位域的内存分配
(1) 位域必须存放在一个字节里面,不能跨越两个字节;(这句有误)
例如:
struct s
{
}sa;
在TC2.0/VC6.0/gcc上sizeof(sa)得到的大小一致为2;
可见,位域可以跨越两个字节,位域可以跨越sizeof(定义位域的类型)个字节!如上例可以跨越sizeof(short)=2个字节。
(2) 位域的长度不能大于1个字节,即不能大于8;(这句也有误)
例如:
struct s
{
}sa;
同样,在TC2.0/VC6.0/gcc上编译通过,且sizeof(sa) = 2;因此同1,位域的长度大小应该是不超过8*sizeof(定义为域的类型)
(3) 关于空域
struct s
{
}sa;
测试结果:sizeof(sa) = 4;空域后面的位域从新的存储单元开始;一个存储单元包括sizeof(定义位域的类型)个字节;
(4) 关于无名域
struct s
{
}sa;
在VC6.0/GCC上测试结果:sizeof(sa) = 2;填充5位,总位数小于16,所以大小为2。
注:把无名域也看成是位域;因此它也必须满足(1)和(2)。
四、位域的使用
五、位域的效率
理所当然(应该是我想当然)这样会降低效率;然而,我看了一些网页上的资料(我没有进行仔细的分析,只是借用别人的结论);对位域成员的访问在编译阶段进行了优化;从生成的汇编源代码看出效率是一样的,并没有降低!
六、结束语
ps:空域的问题
struct A{
};
struct B{
};
sizeof(A)=8 while sizeof(B)=12
struct A{
};
int *p=(int*)&a;
*p=0x80000023;
p=p+1;
*p=0x0000000e;
printf(" %d %d\n",a.a,a.b);
output:3