为什么静态调度如此迅速

时间:2018-11-06 09:59:33

标签: swift static dispatch

我知道类中有一个方法列表。我也知道动态调度的机制。但是我对静态调度感到困惑。静态方法在哪里。全局哈希表中是否有静态方法。以及静态调度如何工作。流程如何?

1 个答案:

答案 0 :(得分:4)

您正在混淆两个独立的概念。

静态分派是指在运行时调用方法主体的方式。如果您的类可能具有子类或任何对象,而您所知道的仅仅是它符合某种协议,则必须使用动态分配,这意味着您必须在表中查找方法的地址(称为vtable或见证表),然后跳转到该位置。如果编译器确切知道它具有哪种对象,例如structfinal类或类中的final方法,它知道该方法不能被覆盖,因此可以直接跳转到其地址而无需进行查找。

声明为static的方法是类型方法。将在类型本身而不是类型的实例上调用它,即在方法self内引用类型而不是类型的实例。

static方法不能被覆盖,因此编译器始终在编译时知道地址,并将对其使用静态分配。不需要任何类型的哈希表或见证表。