代码之家  ›  专栏  ›  技术社区  ›  Kerido

处理程序调用速度:objective-c与虚拟函数

  •  2
  • Kerido  · 技术社区  · 15 年前

    我听说在Objtovi-C中调用一个处理程序(委托等)甚至比调用C++中的一个虚拟函数还要快。是真的吗?如果是,那怎么可能呢?

    不过,虚拟函数的调用并没有那么慢。至少,这是我对调用虚拟函数时发生的事情的理解:

    1. 获取指向 vtbl .
    2. 反引用指针并获取函数指针数组的开头。
    3. 偏移量(指针刻度)数组的开头和方法的索引。考虑到索引在编译时是已知的,所以添加 uintptr_t .
    4. 发行A call 指令。

    不幸的是,我不知道objective-c,所以很难比较性能。但至少,虚拟函数调用的机制看起来没有那么慢,对吧?除了静态函数调用之外,怎么能更快呢?

    1 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    8 年前

    当然,这一切都取决于实现。我不知道obj-c方法调用是否比虚拟函数调用“快”,但它肯定会在球场上——这里有关于机制的讨论:

    Objective C message dispatch mechanism

    迈克·阿什还有更多:

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

    归根结底,选择器是可以缓存的,如果您调用的选择器是在运行时缓存的,则调度是按照虚拟函数调用的操作顺序进行的。

    也:

    1. 标准免责声明:它的性能基本上与几乎所有代码都无关。它只在少数情况下起作用。不能从你的问题中看出,但基本上这不应该是决定是否在纯Obj-C或C++中实现一组代码的决策标准。
    2. 通过在xcode中单步执行asm,您始终可以显式地观察行为(并计算ops:)——如果是,请报告!