第二天的学习直播作业,每次上课都有新的收获💪
结构体对齐
参考内存对齐原则
1.数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如 int 为 4 字节,则要从 4 的整数倍地址开始存储。
2.结构体成员:如果结构体有结构成员,则结构体成员要从其内部最大元素大小的整数倍开始存储
3.收尾工作: 结构体总大小,也就是 sizeof 的结果,必须是内部最大成员的整数倍,不足要补齐。
struct LGStruct1 {
double a; // 8 [0 7]
char b; // 1 [8]
int c; // 4 (9,10,11 [12 13 14 15]
short d; // 2 (15 [16 17] 17 ,收尾 24
} struct1
struct LGStruct3 {
double a; // 8 [0 7]
int b; // 4 [8 9 10 11]
char c; // 1 [12]
short d; // 2 (13 [14 15]) ,要从2的整数倍开始 所以是14
int e; // 4 [16 17 18 19] 收尾 24
// 结构体成员要从其内部最大元素大小的整数倍开始存储
// 故要从最大元成员8的3倍 = 24 开始存储
struct LGStruct1 str; // 24 [24 25 ...47 48] = 48, 是内部最大成员(24)的整数倍,不足要补齐
}struct3;
结果是 48
疑问
如果把 struct1 的去掉 2 个成员变量。这时又会发生什么呢?
struct LGStruct1 {
double a; // 8 [0 7]
char b; // 1 [8] 9 收尾 16
//int c; // 4 (9,10,11 [12 13 14 15]
//short d; // 2 (15 [16 17] 17
} struct1
struct LGStruct3 {
double a; // 8 [0 7]
int b; // 4 [8 9 10 11]
char c; // 1 [12]
short d; // 2 (13 [14 15]) ,要从2的整数倍开始 所以是14
int e; // 4 [16 17 18 19] 收尾 24
// 结构体成员要从其内部最大元素大小的整数倍开始存储
// 故要从最大元成员8的3倍 = 24 开始存储
struct LGStruct1 str; // 16 [24 25 ...39 40] = 40
}struct3;
sizeof打印结果出来 40