一尘不染

Swift有动态分配和虚拟方法吗?

swift

从C ++ / Java / C#背景开始,我期望在Swift中看到虚拟方法,但是在阅读swift文档时,我没有提到虚拟方法。

我想念什么?


阅读 229

收藏
2020-07-07

共1个答案

一尘不染

与C ++不同,不必在Swift中指定方法是虚拟的。编译器将计算出要使用以下哪个:

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

  • 内联方法:0 ns
  • 静态调度:<1.1ns
  • 虚拟调度1.1ns(指定时类似于Java,C#或C ++)。
  • 动态分配4.9ns(如Objective-C)。

当然,Objective-C始终使用后者。4.9ns的开销通常不是问题,因为这只占整个方法执行时间的一小部分。但是,必要时开发人员可以无缝地回退到C或C
++。但是,在Swift中,编译器将分析可以使用最快的哪个,并尝试代表您进行决策,支持内联,静态和虚拟,但保留用于Objective-
C互操作性的消息传递。可以标记一种dynamic鼓励消息传递的方法。

这样做的一个副作用是,动态分配所提供的某些强大功能可能不可用,因为以前假定任何Objective-
C方法都是这种情况。动态分派用于方法拦截,依次由以下人员使用:

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

以上是late binding语言提供的功能。请注意,尽管Java使用vtable调度进行方法调用,但它仍被认为是一种后期绑定语言,因此由于具有虚拟机和类加载器系统而具有上述功能,这是提供运行时检测的另一种方法。“纯”
Swift(不带Objective-C互操作)类似于C
++,因为它是具有静态分派的直接可执行的编译语言,因此在运行时这些动态功能是不可能的。按照ARC的传统,我们可能会看到更多此类功能正在编译时移动,这在“每瓦性能”方面具有优势-
这是移动计算中的重要考虑因素。

2020-07-07