返回
解构IOS底层CacheLookup汇编,洞悉缓存奥秘
IOS
2024-02-22 19:58:46
CacheLookup汇编解析
在上一篇objc_msgSend汇编分析中,我们成功获取到了class,现在让我们继续深入探讨CacheLookup汇编,揭开缓存的神秘面纱。
CacheLookup的逻辑大致如下:
- 将isa首地址平移16个字节大小,得到cache_。
- 检查cache_的首字节是否为0x80,如果是,则跳转到L_lookup_no_cache。
- 从cache_开始,每隔8个字节读取一个值,并与消息选择器进行比较。
- 如果匹配成功,则从cache_开始,每隔16个字节读取一个值,并将其作为消息实现函数。
- 如果匹配失败,则跳转到L_lookup_no_cache。
汇编指令逐行分析
[省略汇编指令]
// 将isa首地址平移16个字节大小,得到cache_
add x1, x0, #0x10
// 检查cache_的首字节是否为0x80,如果是,则跳转到L_lookup_no_cache
ldrb w2, [x1]
cmp w2, #0x80
b.ne L_lookup_cache
// 从cache_开始,每隔8个字节读取一个值,并与消息选择器进行比较
L_lookup_cache:
ldp x2, x3, [x1, #8]
cmp x2, x8
b.ne L_lookup_no_cache
// 如果匹配成功,则从cache_开始,每隔16个字节读取一个值,并将其作为消息实现函数
ldr x0, [x1, #0x10]
b L_return
// 如果匹配失败,则跳转到L_lookup_no_cache
L_lookup_no_cache:
[省略汇编指令]
汇编指令解析总结
从汇编指令中,我们可以发现CacheLookup汇编的主要功能是:
- 将isa首地址平移16个字节大小,得到cache_。
- 检查cache_的首字节是否为0x80,如果是,则说明没有缓存,直接跳转到L_lookup_no_cache。
- 从cache_开始,每隔8个字节读取一个值,并与消息选择器进行比较。如果匹配成功,则从cache_开始,每隔16个字节读取一个值,并将其作为消息实现函数。如果匹配失败,则跳转到L_lookup_no_cache。
结语
通过对CacheLookup汇编的分析,我们对IOS底层的缓存机制有了更深入的了解。缓存机制可以有效地提高消息发送的性能,减少内存访问的次数。在实际开发中,我们可以利用缓存机制来优化代码的性能。