iOS开发 OC对象原理--结构体内存对齐

222 阅读1分钟

alloc的底层为什么是objc_alloc

  1. 我们首先alloc一个LGPerson对象,并且断点。

image-20210608211102482.png

  1. 然后step into(直接点击即可)。

image-20210608211238511.png

  1. 会进入底层的alloc方法,然后发现底层调用的并不是objc_alloc而是_objc_rootAlloc image-20210608211329616.png

image.png 4. 但如果我们在第二步同时按住control再step into会进入汇编命令,然后发现调用的又是objc_alloc,有点奇怪 image-20210608211634476.png

  1. 于是我们在objc源码工程中搜索objc_alloc发现了该方法,该方法接收到的msg的sel如果是alloc,则将对应msg的imp修改为objc_alloc,也就是修改了sel和imp的绑定,但是从方法名看出这似乎是出了错误之后的“fixup”,那么正常情况下是怎样的呢?我们只能从更底层的llvm一探究竟。 image-20210608212655049.png

  2. 未完待续

结构体内存对齐

image.png

示例1

// 正常结构体
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
}struct1;

示例2

// 结构体嵌套
struct LGStruct2 {
    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;    // 24   (19 20 21 22 23 [24 25...41 47]
 // 该结构体的总大小必须为double的整数倍,所以是最终总大小为48
}struct3;