结构体内存对齐是面试时比较热门的考点,下面详细阐述一下如何计算结构体的内存对齐。
结构体内存对齐最基本规则:
1.每个结构体成员都要对齐到自身对齐数的整数位置处
2.结构体总大小为最大对齐数的整数倍。
自身对齐数 = 编译器默认对齐数 与该成员大小的较小值(注:vs编译器的默认对齐数是8)
举个例子你更容易理解:
struct S1 {
char c1;
int i;
char c2;
};
上例中:
c1是char类型,占1个字节;
i是int类型,大小是4,而编译器默认对齐数是8,取两者较小值,所以i的对齐数是4。对齐到4的整数倍,所以i从偏移量4的位置向后数,占4个字节。
c2对齐数是1与8中的较小值,即1,所以从偏移量9的位置往后占一个字节。
这样算来结构体目前的大小为(1+3) + 4 + (1) = 9
本例中最大对齐数是最大对齐数的整数倍,所以在9的基础上往后取12,这才是本结构体的大小。
最终本结构体的大小为(1+3) + 4 + (1+3)=12