为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。如double 偏移量必须为sizeof(double)即8的倍数。
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
eg:
struct B
{
char a;//1byte,后跟7个byte填充以满足float b的对齐
double b;//8byte
short int c;//4byte
};//另外整个struct的大小必须是8(sizeof(b))的倍数,所以c后面还要填充4byte,所以sizeof(B)=24
struct C
{
char a;//1byte,后跟7个byte填充以满足b的对齐,可能b只能起始于8的倍数处,应为b的最大空间的类型
//所占用的字节数为8,不知道是否如此?
B b;//24bytes
};//sizeof(C)=32,
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。
可以参考:http://blog.vckbase.com/panic/archive/2005/04/02/4340.aspx