OC内存对其规则详解

2019-12-25  本文已影响0人  你duck不必呀

这是一个简单的结构体

 struct{
        char a;
        double b;
        int c;
        short d;
    }struct1;

NSLog(@"%lu",sizeof(struct1));

输出为:

24

先看一下对其规则

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

区分有没有子成员的情况

没有子成员:

//从0开始第一个位置
struct memberOne{
                char a;    [0]  //1 第一个元素在offset为0的位置
                double b;  [8,15]  //char先补足到8,从8的位置开始放
                int c;     [16,19]//16正好是4的倍数,直接放
                short d;   [20,21] //20正好是2的倍数,直接放
               };          [23]//整体必须是最大子成员8的倍数,需要补到23

图解:


截屏.png

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

有子成员

struct memberTwo{
               char a;     //1
               double b;   //8
               int c;      //4
               short d;    //2
              };           //24
       
       struct memberOne{
               char a;     //1
               double b;   //8
               int c;      //4
               short d;    //2
               struct memberTwo e;//24
       }member1;           //48

NSLog(@"%lu",sizeof(member1));

输出:

48

图解:


截屏.png

因为多了一个memberTwo, memberTwo成员中的最大子成员是double size=8,所以要满足8的倍数
3.结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员(如果有子成员,参考规则2)的整数倍.不足的要补⻬对齐

上一篇 下一篇

猜你喜欢

热点阅读