美文网首页iOS底层原理
iOS结构体内存对齐原则初探

iOS结构体内存对齐原则初探

作者: 何必太轻浮 | 来源:发表于2020-09-09 18:44 被阅读0次

    为什么OC对象在开辟内存的时候会有内存对齐原则,在对象申请内存的时候是16字节对齐的,在真正开辟所需要的内存时时8字节对齐的,为什么会有这些对齐呢,主要是为了容错,那具体怎么看对象是怎么对齐的呢,我们可以通过研究struct结构体的内存对齐原则来稍微了解下(ps:对象的内存对齐是对结构体内存对齐的优化)

    1.数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要

    从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
    结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
    储。

    文字看起来很麻烦,直接上代码

    struct MCStruct1 {
        char a; //1  [0]
        short b; //2 1 [2 3]
        double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
        char d; //16  [16]
    }mcstaruct1; //一共占用17个字节,但是要是里面最大的属性字节大小的倍数,所以是8的倍数,为24个字节
    

    开始运行,结果如图,跟我们预计是是一样的


    pic0

    那如果结构体内嵌结构体呢,那就会遵循第二个结构体内存对齐原则

    2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从

    其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
    里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

    直接上代码

    
    struct MCStruct1 {
        char a; //1  [0]
        short b; //2 1 [2 3]
        double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
        char d; //16  [16]
    }mcstaruct1; //一共占用17个字节,但是要是里面最大的属性字节大小的倍数,所以是8的倍数,为24个字节
    
    struct MCStruct2 {
        char a; //1  [0]
        short b; //2 1 [2 3]
        double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
        struct MCStruct1 d;//24 字节
    }mcstaruct2;//16 + 24 = 40字节 刚好是里面结构内结构体最大属性字节数8的倍数,所以大小为40字节
    

    开始运行,结果如下


    pic1

    OC对象的内存对齐是类似于结构体的内存对齐的,只是更优于结构体的内存对齐。

    相关文章

      网友评论

        本文标题:iOS结构体内存对齐原则初探

        本文链接:https://www.haomeiwen.com/subject/zxhyektx.html