初探OC底层原理之《结构体内存分析》

一.先了解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.结构体的内存大小与成员的内存大小有关
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容