内存对齐规则
首先要引入对齐数这个名词,每个编译器都有其各自默认的对齐数,VS中该对齐数为8。而在结构体中,每个成员变量都有一个对齐数,大小为它占用的字节大小,如int的对齐数大小为4,double为8。
具体规则如下:
1、结构体的第一个成员变量对齐到和结构体变量起始位置偏移量为0的地址处;可以理解为第一个成员变量从0这个位置开始往后对齐;
2、其他成员变量要对齐某个数字的整数倍的位置处,该数字为这个成员变量的对齐数与编译器默认对齐数的较小值;
3、结构体总大小为所有成员变量对齐数中最大对齐数的整数倍;
举例说明:
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
c1是char型,大小为1,与VS默认对齐数8相比较小,则对齐数为1;c2同理,对齐数也为1;i为int型,大小为4,与8相比较小,则对齐数为4;
结构体第一个成员变量从位置0开始向后对齐,每个成员变量对齐到其对齐数整数倍处,故i要对齐到4的整数倍处;
S1与S2的最大对齐数为int型的大小4,而结构体整体大小为最大对齐数的整数倍,所以S1大小为12,S2大小为8