OC底层原理07:malloc源码探索
前言
我们在 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_zone
是 malloc_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.