我听说在 Objective-C 中调用处理程序(委托(delegate)等)甚至比在 C++ 中调用虚函数还要快。真的正确吗?如果是这样,那怎么可能?
据我所知,虚拟函数的调用并不慢。至少,这是我对调用虚函数时发生的情况的理解:
- 获取指向
vtbl
的指针。 - 取消对指针的引用并获取函数指针数组的开头。
- 使用方法索引偏移数组的开头(以指针比例表示)。考虑到索引在编译时已知,因此只需添加
uintptr_t
的倍数即可。 - 发出
call
指令。
不幸的是,我不了解 Objective-C,所以我很难比较性能。但至少,虚函数调用的机制看起来并没有那么慢,对吧?除了静态函数调用之外,还有什么方法可以更快呢?
最佳答案
当然,这完全取决于实现。我不知道 Obj-C 方法调用是否可以比虚拟函数调用“更快”,但它肯定是在大概范围内 - 这里有关于 SO 机制的讨论:
Objective C message dispatch mechanism
迈克阿什在这里有更多内容:
http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html
底线是,选择器可以被缓存,如果您调用的选择器在运行时被缓存,则分派(dispatch)将按照虚拟函数调用的操作顺序进行。
另外:
- 标准免责声明:其性能本质上与几乎所有代码无关。它只在极少数情况下才重要。从你的问题中无法看出,但基本上这不应该成为决定是否用纯 Obj-C 还是 C++ 实现一堆代码的决策标准。
- 您始终可以通过在 Xcode 中单步执行 asm 来明确观察行为(并计算操作数:))——如果您这样做,请报告回来!
关于c++ - 处理程序调用速度: Objective-C vs virtual functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2438801/