使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
注意:1.相邻位域字段类型相同的,看位宽之和;2.相邻位域字段类型不同的,看是否压缩;
3.整个结构体总大小为最宽基本类型整数倍。
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
| #include <iostream> using namespace std; int main() { struct test1 { char a:1; char b:2; char c:7; }; cout << sizeof(test1) << endl;//vc:2,gcc:2; /*test1 *a b类型相同,位数和为3,所以存放在一个字节中(规则1); *该字节剩余5位不足以存放c,c存于新的字节中(规则2),所以test1占2字节。 */ struct test2 { char a:1; short b:2; char c:2; }; cout << sizeof(test2) << endl;//vc6:6,gcc:2. /*test2 * vc6不压缩:a存于第一个字节,b存于第三个字节!(short 2字节要能够整除起始地址)占2字节, * c存于第4字节,一共5字节,对齐后6字节。 * gcc压缩:1字节,根据规则5,short两字节,对齐后2字节。 **/ struct test3 { char a :1; char b :2; long c :3; char d :2; }; cout << sizeof(test3) << endl;//vc6:12,gcc:4. return 0; }
|