位域,就是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。
1、很多书上都说,位域存储在同一个字节中,不能跨两个字节存储。个人发现这个规则有问题,下面的例子在vs 2005下能正确编译和运行,至少说明了位域可以跨字节:
#include <iostream> using namespace std; typedef struct s { short a:9; short b:7; //int c:17; //int d:15; }sa; int main () { sa test; cout << sizeof(test) << endl; return 0; }结果:2
4、如果相邻域字段类型不同,依赖于编译器的具体实现。VC和VS采用不压缩方式,即不同位域字段存放在不同的位域类型字节中,而gcc采用压缩方式。如:
#include <stdio.h> struct ss { char a:1; char b:2; char c:3; long d:2; }; typedef struct ss A; int main( ) { A test; printf("%d\n", sizeof(test)); return 0; }a, b, c三字段类型相同,遵守规则3,紧临存储,共占1个字节;
在VC和VS下,由于采取不压缩方式,加上内存对齐规则,sizeof(ss)为1 + 3(填充) + 4 = 8字节;
GCC下,采取压缩方式,sizeof(ss)= sizeof(long) = 4,即全部存储在long的4个字节中。
再例如:
struct ss { int a:8; char d:4; int b:3; long c:2; };
int和long可看成同一类型,在VC和VS下b和c占用同一字节,sizeof(ss)= 12,如果将c改为char类型,大小将变为4 +4+4+4 = 16;
GCC下sizeof(ss)= sizeof(long) = 4