Swift是否使用消息调度方法?

Mr.*_*ith 6 swift

我确定我的术语已经关闭,所以这是一个例子:

  • C/C++有方法和虚方法.两者都有机会在编译时进行内联.
  • C#的CIL有callcallvirt指令(非常类似于C++方法和虚方法).尽管C#中的几乎所有方法调用都会变成callvirt(由于语言错误),但JIT编译器能够优化大多数返回call指令,然后(如果有价值)也可以内联它们.
  • Objective-C方法调用的完成方式非常不同(并且效率低下); objc_msgsend每次调用方法时都会传递一个消息对象,它是动态调度的一种形式,永远不能内联.

阅读Swift 函数的语言规范,我不知道Swift是否使用与Objective-C相同的消息传递系统或其他不同的消息传递系统.

ipm*_*mcc 11

有时是,有时没有.如果你有纯swift代码,并且没有通过@objc装饰将你的类/协议暴露给Objective-C ,那么看起来不会通过pure-swift方法调用来调度它objc_msgSend,但是在其他情况下它们是.如果您的swift对象采用的协议是在Objective-C中声明的,或者如果使用swift协议进行修饰@objc,那么通过调度方法调用协议方法,甚至从swift对象到其他swift对象objc_msgSend.

文档目前有点薄; 我确定还有其他的细微差别......但从经验上讲(即我已经尝试过了)一些快速的方法调用会通过objc_msgSend而其他方法则不会.我认为获得最佳性能将取决于保持您的代码尽可能多的纯粹swift并尽可能少地跨越Obj-C/swift边界,并通过瓶颈接口/协议,以限制快速调用的数量必须动态调度.

我相信迟早会出现更详细的文档.