今天我们来说说结构体内存对齐,废话少说~~
先上代码和输出结果:

代码解析:
1.普通结构体
struct MyStruct1 {
double a; // 占8字节 起始位置(0-7)
char b; // 占1字节 起始位置(8)
int c; // 占4字节 因9不是4的整数倍 所以 起始位置为(12 13 14 15)
short d; // 占2字节 起始位置为 (16 17)
}struct1;
内部大小:18 (0-17)
最大成员属性:8
结构体总大小: 24 因为必须是最大成员8的整数倍 18不足 补齐后是 24
2.嵌套结构体
structMYStruct2 {
doublea; //占8字节 (0-7)
intb; //占4字节 (8 9 10 11)
charc; //占1字节 (12)
shortd; //占2字节 因13不是2的整数倍 所以起始位置(14 15)
struct MYStruct1 str1; //占24字节 16正好是最大成员8的整数倍所以 起始位置(16 ... 39)
}mystruct2;
内部大小:40 (0-39)
最大成员属性:8
结构体总大小: 40 因为必须是最大成员8的整数倍 不用补齐 正好~~
总结:结构体内存对齐原则:
1.第⼀个数据成员放在offset为0的地方
2.后续的成员起始位置要从该成员大小的整数倍开始,若该成员是结构体或者数组等,则从其内部最⼤元素⼤⼩的整数倍地址开始存储
3.结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤成员的整数倍.不⾜的要补⻬
网友评论