返回

解构IOS底层CacheLookup汇编,洞悉缓存奥秘

IOS

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底层的缓存机制有了更深入的了解。缓存机制可以有效地提高消息发送的性能,减少内存访问的次数。在实际开发中,我们可以利用缓存机制来优化代码的性能。