美文网首页
2.iOS底层学习之内存对齐

2.iOS底层学习之内存对齐

作者: 牛牛大王奥利给 | 来源:发表于2021-06-09 18:40 被阅读0次
    学习了内存对齐之后的疑问?🤔

    1.为啥要内存对齐?
    2.内存对齐的规则?
    3.内存对齐实例分析。

    内存对齐的目的

    上网搜了好多相关的资料,主要是由内存的结构和排布的原因。


    281623215064_.pic.jpg 271623215057_.pic.jpg

    所以编译器如果不进行内存对齐,当取两个,四个或者八个字节的数据就有可能跨chip。这样cpu就要通过两次寻址找到完整数据,并对数据进行拼接,效率上就损失了好多。因此以空间来置换时间,会进行对齐。

    内存对齐的规则

    1.数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
    ⼀个数据成员放在offset为0的地⽅,以后每个数据成员存储的起始位置要
    从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,
    结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存
    储。 min(当前开始的位置m n) m = 9 n = 4 9 10 11 12。

    2.结构体作为成员:如果⼀个结构⾥有某些结构体成员,则结构体成员要从
    其内部最⼤元素⼤⼩的整数倍地址开始存储.(struct a⾥存有struct b,b
    ⾥有char,int ,double等元素,那b应该从8的整数倍开始存储.)

    3.收尾⼯作:结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤
    成员的整数倍.不⾜的要补⻬。

    内存对齐实例

    下列结构体占用多少内存?

    struct LGStruct1 {
        double a;     //8
        char b;        //1
        int c;          //4
        short d;     //2
    }struct1;
    
    struct LGStruct3 {
        double a; //8
        int b;  //4
        char c;  //1
        short d;  //2
        int e; //4
        struct LGStruct1 str; 
    }struct3;
    

    先来分析LGStruct1的内存排布,按照规则:
    -a存放在 0~7;
    -b在8;
    -c因为9不是4的倍数所以要向后移 9:空 10:空 11:空 (12,13,14,15):c
    -d是两个字节,所以16~17:d。
    -最后整个内存空间要为最大成员的整数倍,就是24。

    然后分析LGStruct3的内存分配:
    -a存放在 0~7;
    -b在8~11;
    -c在12;
    -d从14开始放,14~15:d
    -e在16~19。
    str根据规则2从LGStruct1的成员中最大的成员的整数倍开始存,那么str从24开始。
    -str.a :24~31;
    -str.b:32;
    -str.c:36~39;
    -str.d:40~41;

    最后调整为最大8的倍数48。

    有问题会后续补充

    相关文章

      网友评论

          本文标题:2.iOS底层学习之内存对齐

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