c++ - 处理程序调用速度: Objective-C vs virtual functions

标签 c++ objective-c function delegates

我听说在 Objective-C 中调用处理程序(委托(delegate)等)甚至比在 C++ 中调用虚函数还要快。真的正确吗?如果是这样,那怎么可能?

据我所知,虚拟函数的调用并不慢。至少,这是我对调用虚函数时发生的情况的理解:

  1. 获取指向vtbl的指针。
  2. 取消对指针的引用并获取函数指针数组的开头。
  3. 使用方法索引偏移数组的开头(以指针比例表示)。考虑到索引在编译时已知,因此只需添加 uintptr_t 的倍数即可。
  4. 发出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)将按照虚拟函数调用的操作顺序进行。

另外:

  1. 标准免责声明:其性能本质上与几乎所有代码无关。它只在极少数情况下才重要。从你的问题中无法看出,但基本上这不应该成为决定是否用纯 Obj-C 还是 C++ 实现一堆代码的决策标准。
  2. 您始终可以通过在 Xcode 中单步执行 asm 来明确观察行为(并计算操作数:))——如果您这样做,请报告回来!

关于c++ - 处理程序调用速度: Objective-C vs virtual functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2438801/

相关文章:

c++ - 在构造函数中调用虚函数

c++ - 通过存储指向成员函数的指针的虚拟行为

c++ - 带有大括号的 char 数组的非静态成员初始化在 gcc 中给出了一个错误,而不是在 clang 中

ios - NSStream 委托(delegate)未触发错误

c - 为什么在使用函数和宏时会得到不同的结果?

php - 如何从 PHP 扩展返回 C++ 对象数组

iphone - 将 CoreData 用于第一个 iPhone 应用程序?

ios - 如何确定我的静态库是否正常工作

C++:错误:预期的主表达式

function - (a -> a) 和 a -> a 之间的区别