虚拟方法 – Swift是否具有动态调度和虚拟方法?

来自C / Java / C#背景我期待在Swift中看到虚拟方法,但是阅读swift文档,我没有提到虚拟方法.

我失踪了什么

最佳答案
与C不同,Swift中没有必要指定一个方法是虚拟的.编译器将确定使用以下哪项:

(性能指标当然取决于硬件)

>内联方法:0 ns
>静态调度: 1.1ns
>虚拟派遣1.1ns(如Java,C#或C指定时).
>动态调度4.9ns(如Objective-C).

Objective-C当然总是使用后者. 4.9ns的开销通常不是问题,因为这将代表总体方法执行时间的一小部分.不过,如有需要,开发商可以无缝地回溯到C或C.然而,在Swift中,编译器将分析哪一个可以使用的速度最快,并尝试代表您,有利于内联,静态和虚拟,但保留Objective-C互操作性的消息传递.它可以标记一个方法与动态来鼓励消息传递.

这一点的一个副作用是,动态调度提供的一些强大功能可能不可用,其中由于以前可能被认为是任何Objective-C方法的情况.动态调度用于方法截取,反过来使用:

>可可风格的财产观察员.
> CoreData模型对象检测.
>面向方面的编程

上述特征是由后期绑定语言提供的功能.请注意,虽然Java使用vtable dispatch进行方法调用,但它仍然被认为是后期绑定语言,因此通过拥有虚拟机和类加载器系统能够实现上述功能,这是提供运行时工具的另一种方法. “Pure”Swift(没有Objective-C interop)就像C一样,是一种具有静态调度功能的直接可执行编译语言,那么这些动态特性在运行时是不可能的.在ARC的传统中,我们可能会看到更多的这些功能转向编译时间,这为“每瓦性能”提供了一个优势 – 移动计算中的重要考虑.

转载注明原文:虚拟方法 – Swift是否具有动态调度和虚拟方法? - 代码日志