alloc底层分析续及结构体内存对齐

259 阅读2分钟

一.sel和imp的关系

sel:相当于目录

imp:相当于页码,可以通过页码找到对应的内容

二. 苹果对alloc的底层拦截

image.png

fixupessageRef 存在于

image.png 是对fixup的修复

image.png

苹果认为alloc比较特殊,底层对此作了hook,先找objc_alloc,然后再去找alloc。

运行代码,断点可得 image.png

进入callAlloc可得

image.png

最终会调用对象的alloc方法 从而调用_objc_rootAlloc

image.png

总结:LLVM对alloc的hook流程

image.png

三.内存对齐原则

属性、成员变量会影响对象的内存的大小,方法不影响对象内存的大小 image.png

结构体内存大小

image.png

结构体内存对齐原则

  • 数据成员对齐原则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要改成员有子成员,比如说是数组、结构体等)的整数倍开始(比如int为4字节,则要从4的证书倍地址开始存储)
  • 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(struct a 里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储)
  • 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐

练习:

image.png

四.malloc探索

image.png

image.png

打印结果

image.png 在libmalloc-317.40.8源码中找到了核心代码,内存对齐以16字节的方式 堆 对象的内存 16字节对齐 成员变量 8字节对齐 结构内部 对象 16字节对齐

基础知识补充

LLDB文档.png