为什么静态分派在 swift 中这么快
why static dispatch so quickly in swift
我知道 class 中有一个方法列表。而且我也知道动态调度的机制。但我混淆了静态调度。 Where are static methods in。静态方法是否在全局散列中table。以及静态调度如何工作。流量怎么样。
您混淆了两个不同的概念。
静态调度是指在运行时调用方法体的方式。如果你有一个 class 可能有子 classes 或任何你知道它符合特定协议的对象,你必须使用动态调度,这意味着你必须在 table(称为 vtable 或 witness table)中查找方法的地址,然后跳转到该位置。如果编译器确切地知道它有什么样的对象,例如struct
、final
class 或 class 中的 final
方法,它知道该方法不能被覆盖,因此可以直接跳转到它的地址而不用正在查找。
声明为 static
的方法是类型方法。它将在类型本身而不是类型的实例上调用,即在方法内部 self
指的是类型而不是类型的实例。
static
方法不能被重写,所以编译器总是在编译时知道地址,并将对它们使用静态分派。不需要任何类型的哈希 table 或见证 table.
我知道 class 中有一个方法列表。而且我也知道动态调度的机制。但我混淆了静态调度。 Where are static methods in。静态方法是否在全局散列中table。以及静态调度如何工作。流量怎么样。
您混淆了两个不同的概念。
静态调度是指在运行时调用方法体的方式。如果你有一个 class 可能有子 classes 或任何你知道它符合特定协议的对象,你必须使用动态调度,这意味着你必须在 table(称为 vtable 或 witness table)中查找方法的地址,然后跳转到该位置。如果编译器确切地知道它有什么样的对象,例如struct
、final
class 或 class 中的 final
方法,它知道该方法不能被覆盖,因此可以直接跳转到它的地址而不用正在查找。
声明为 static
的方法是类型方法。它将在类型本身而不是类型的实例上调用,即在方法内部 self
指的是类型而不是类型的实例。
static
方法不能被重写,所以编译器总是在编译时知道地址,并将对它们使用静态分派。不需要任何类型的哈希 table 或见证 table.