内存对齐规则:
1)数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始
简单的说就是这样:
Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数
举个例子来说明一下:
struct name1{ char str; //在0偏移处存放,占1字节 short x; //原本应在第二个字节处存放(偏移量为1),但是偏移量应为2的整数倍,所以应该加1, //在第三个字节处存放(偏移量为2) int num; } sizeof(struct name1) = 1 + 1 + 2 + 4 = 8 struct name2{ char str; int num; //存放int型,偏移量应为4的倍数,故应在存放了一个字节的char型数据后,再偏移3个字节, //存放int型数据 short x; } sizeof(struct name2)=1 + 3 + 4 + 2 = 10 此处注意,其结果应该为12
这就要提到下一个规则了
2)结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
由这条规则刊出,上题中struct name2中最大的成员为int,4个字节,结果应是4的整数倍,故为12
还有一条规则,也很重要,我们知道,结构体的成员可以是结构体,那么该如何存储呢?
3)
如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)