处理程序调用速度:Objective-C vs虚函数

Ker*_*ido 2 c++ delegates function objective-c

我听说在Objective-C中调用处理程序(委托等)比在C++中调用虚函数更快.这是真的吗?如果是这样,怎么会这样?

AFAIK,虚拟功能调用起来并不慢.至少,这是我对调用虚函数时会发生什么的理解:

  1. 获取指针vtbl.
  2. 取消引用指针并获取函数指针数组的开头.
  3. 使用方法的索引偏移(在指针刻度中)数组的开头.考虑到索引在编译时是已知的,它就像添加多个索引一样简单uintptr_t.
  4. 发出call指示.

不幸的是,我不知道Objective-C所以我很难比较性能.但至少,虚函数调用的机制看起来并不那么慢,对吧?静态函数调用以外的其他东西怎么能更快?

Ben*_*tto 5

当然,这完全取决于实现.我不知道Obj-C方法调用是否比虚函数调用"更快",但它肯定可以在球场上 - 这里有关于SO的机制的讨论:

Objective C消息调度机制

和Mike Ash在这里有更多:

http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html

最重要的是,可以缓存选择器,如果您正在调用的选择器在运行时缓存,则调度按虚函数调用的操作顺序进行.

也:

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