对齐规律:占用最大成员类型的整数倍,每个成员的对齐地址为该成员类型的整数倍
struct
{
int a; 0-3
char b;4-5
int c;8-11
}:12
含位域:
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
struct test
{
char
a:1;
char :2;
char
b:3;
char
c:2;
};
test
t1;
int len=sizeof(t1);
//len=1
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
struct test
{
char a:1;0-1
char :2;0-1
char :6;1-2
};
2
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
非压缩存储:
struct T0
{
char c:2;
int i:1;
};
cout << "struct T0{ char c:2; int i:1;} = " << sizeof(T0) << endl; //dev c++:4 vc6:8
依然要满足不含位域结构体内存对齐准则第2条,i成员相对于结构体首地址的偏移应该是4的整数倍,所以c成员后要填充3个字节,然后再开辟4个字节的空间作为int型,其中4位用来存放i,所以上面结构体在VC中所占空间为8个字节;而对于采用压缩方式的编译器来说,遵循不含位域结构体内存对齐准则第2条,不同的是,如果填充的3个字节能容纳后面成员的位,则压缩到填充字节中,不能容纳,则要单独开辟空间,所以上面结构体T0在GCC或者Dev-C++中所占空间应该是4个字节
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
struct test
{
char a:1;0-1
char :2;0-1
long c;4-7
char
:6;7-8
};:12
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
原文:http://www.cnblogs.com/jsy306/p/3735299.html