为何调用`free(malloc(8))`?Objective-C运行时代码疑问
Objective-C运行时相关两个问题解答
一、hashtable2.mm中free(malloc(8));的作用
这段代码是用来提前触发malloc的初始化流程。早期Objective-C运行时依赖的libmalloc实现,在首次分配内存时需要完成一系列初始化工作:比如设置线程本地存储结构、初始化内存块元数据管理系统、建立内存分配的基础上下文等。
直接分配8字节再立即释放,是因为这个大小刚好能触发malloc的初始化逻辑,且不会留下无用内存占用。在运行时bootstrap阶段做这件事,是为了把malloc的初始化开销提前到启动流程里,避免后续真正需要分配内存(比如类加载、对象创建)时,突然触发初始化导致的性能波动或潜在线程安全问题。8字节是当时系统环境下的最小有效分配单位,刚好满足触发初始化的条件。
二、objc-os.h中malloc_zone_malloc签名与实现参数不一致的原因
标准的malloc_zone_malloc签名是void *malloc_zone_malloc(malloc_zone_t *zone, size_t size),需要传入内存分配区和分配大小两个参数。如果看到实现里只用到一个参数,通常是以下两种情况:
- 宏/内联函数包装:
objc-os.h里可能定义了宏或者静态内联函数,把zone参数默认设置为当前的默认分配区(比如通过malloc_default_zone()自动获取),对外暴露的接口看起来只需要传size,但内部已经帮你填充了zone参数。 - 历史兼容或特定编译条件:早期的malloc接口参数更少,后来为支持多内存分配区才增加了
zone参数。运行时代码为兼容旧实现,或者在单分配区的编译环境下,直接省略了zone参数的显式使用,默认使用全局分配区。
内容的提问来源于stack exchange,提问作者Crazs
相关产品推荐
相关产品推荐

