OC底层原理07:malloc源码探索

张建 lol

前言

我们在 OC底层原理03:alloc&init&new探索 文章中,分别得知alloc最核心的三个操作:

  • 第一个核心方法:cls->instanceSize,我们得知是申请内存大小,系统默认是 16 字节对齐。

  • 第二个核心方法:calloc,即申请内存,即今天要 探索 的内容,其实探索的本质也是为了验证ios中对象中实际的对齐方式是 8 字节对齐

objc4中分析calloc 源码

OC底层原理03:alloc&init&new探索 文章中可知,obj = (id)calloc(1, size)调用的源码不在objc4中,如下图:

实际上 calloc 的源码需要查看 libmalloc源码 中,可以在 这里 下载最新版,然后去探索

libmalloc中分析calloc源码

1、第一步:在main中使用 calloc 创建一个指针

2、第二步:进入 calloc 的源码实现,其中的关键代码是 malloc_zone_calloc

其中 default_zonemalloc_zone_t 类型:

1
static malloc_zone_t *default_zone = &virtual_default_zone.malloc_zone;

3、第三步:进入 malloc_zone_calloc 的源码实现,其中关键代码是 zone->calloc

到这里,我们点击 calloc 发现,找不到下面要执行的源码了,我们通过终端 p zone->calloc 去查看一下底层调用:

由此可发现,内部起始调用的是 default_zone_calloc

4、第四步:断点调试查看 default_zone_calloc 内部源码

与上面一样,终端 p zone->calloc 去查看一下底层调用:

由此可发现,内部起始调用的是 nano_calloc

5、第五步:断点调试查看 nano_calloc 内部源码

  • 如果要开辟的空间小于 NANO_MAX_SIZE 则进行,我们通过断点调试,发现执行的是这个流程

  • 否则就进行 helper_zone 的流程

6、第六步:点进 _nano_malloc_check_clear 查看内部源码

7、第七步:点进关键代码 segregated_size_to_fit 查看源码

由上面的图,我们可以得知 size 为传入 24 ,但是最后返回的 slot_bytes 实际上是 32,说明是 16 位的倍数,计算方法图上已经说明

8、第八步:如果是第一次调用 segregated_next_block 函数,band 不存在,缓存也不会存在,所以会调用segregated_band_grow。来开辟新的 band

  • Post title:OC底层原理07:malloc源码探索
  • Post author:张建
  • Create time:2020-09-16 02:06:06
  • Post link:https://redefine.ohevan.com/2020/09/16/OC底层原理/OC底层原理07:malloc源码探索/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
OC底层原理07:malloc源码探索