一.先了解c和oc不同类型所对应字节如下图

image.png
二.了解内存对齐规则
*1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
⼀个数据成员放在offset为0的地⽅,以后每个数据成员存储的起始位置要
从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存
储。
列如 int a 如果起始为 7 那么 7 舍弃 从8开始 后面数4位 就是 8,9,10,11
*2:结构体作为成员:如果⼀个结构⾥有某些结构体成员,则结构体成员要从
其内部最⼤元素⼤⼩的整数倍地址开始存储.(struct a⾥存有struct b,b
⾥有char,int ,double等元素,那b应该从8的整数倍开始存储.)
*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 [16 17] 24 //LGStruct1 最大成员是a,8的整数倍且不能小于17 所以是 24
}struct1;
struct LGStruct2 {
double a; // 8 [0 7]
int b; // 4 [8 9 10 11]
char c; // 1 [12]
short d; // 2 (13 [14 15] 16 //LGStruct2 最大成员是a 8的整数倍且不能小于15 所以是 16
}struct2;
// 家庭作业 : 结构体内存对齐
struct LGStruct3 {
double a; //8 [0 7]
int b; //4 [8 9 10 11]
char c; //1 [12]
short d; // 2 13 [14 15]
int e; // 4 [16 17 18 19]
struct LGStruct1 str; //因为LGStruct1结构体的实际内存大小是17按照内存原则取结构体里面最大的成员变量开始 20 21 22 23 [24 ...41]LGStruct3里面最大成因是 LGStruct1 他的内存大小是24 取24的整数倍是 48 所有内存大小是48
}struct3;
-
输出结果如下
image.png
从上面结果验证可以得出结论
- 1.结构体内存大小跟数据排列有关
- 2.结构体的内存大小与成员的内存大小有关
