结构体内存对齐
先看两段代码,两段代码仅顺序不同,其结果输出就出现了不同。
struct S
{
char c1;//1 8 1
int i;//4 8 4
char c2;//1 8 1
};
struct S2
{
char c1;
char c2;
int i;
};
int main()
{
struct S s = { 0 };
struct S2 s2 = { 0 };
printf("%d\n", sizeof(s));//12
printf("%d\n", sizeof(s2));//8
return 0;
}
接下来对其中的S进行单独分析:
struct S
{
char c1;//1
int i;//4
char c2;//1
};
int main()
{
struct S s = { 0 };
printf("%p\n", &s);//002FFED8
printf("%p\n", &(s.c1));//002FFED8
printf("%p\n", &(s.i));//002FFEDC
printf("%p\n", &(s.c2));//002FFEE0
return 0;
}
结构体内存对齐的规则:
1.结构体的第一个成员永远都对齐到结构体的起始位置处。
2.从第二个成员开始,每个成员都对齐到某个对齐数的整数倍处。
对齐数:成员自身大小和默认对齐数的较小值
默认对齐数:VS-8 Linux-gcc-4
3.结构体的总大小是所有成员中最大对齐数的整数倍。