内存对齐
1.对于结构体的各个成员,第一个成员位于偏移为0的位置,结构体第一个成员的偏移量(offset)为0,以后每个成员相对于结构体首地址的offset都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节。
2.除了结构成员需要对齐,结构本身也需要对齐,结构的长度必须是编译器默认的对齐长度和成员中最长类型中最小的数据大小的倍数对齐。
//32位系统,最小对齐数为4 #include<stdio.h> struct { int i; //占用0-3 char c1; //占用4 char c2; //占用5(因为CHAR的字节为1小于最小字节数,偏移量为1的倍数即可)6,7为补字节 }x1; struct{ char c1; //占用0 int i; //1,2,3为补字节,4-7为i所占用字节,因为i的大小为4字节,所以偏移量必须是4的倍数,补齐字节。 char c2; //占用8 9,10,11为补字节,struct的大小必须为最大变量和对齐数的最小值的倍数,即为4的倍数 }x2; struct{ char c1; char c2; int i; }x3; int main() { printf(%d\n,sizeof(x1)); // 输出8 printf(%d\n,sizeof(x2)); // 输出12 printf(%d\n,sizeof(x3)); // 输出8 return 0; }
参考链接:https://blog.csdn.net/qq_39397165/article/details/119745975