【发布时间】:2023-03-06 07:00:01
【问题描述】:
我知道类中有一个方法列表。而且我也知道动态调度的机制。但我对静态调度感到困惑。静态方法在哪里。静态方法是否在全局哈希表中。以及静态调度是如何工作的。流程是什么样的。
【问题讨论】:
我知道类中有一个方法列表。而且我也知道动态调度的机制。但我对静态调度感到困惑。静态方法在哪里。静态方法是否在全局哈希表中。以及静态调度是如何工作的。流程是什么样的。
【问题讨论】:
您混淆了两个独立的概念。
静态分派是指在运行时调用方法体的方式。如果你有一个类可能有子类或任何你只知道它符合某个协议的对象,你必须使用动态调度,这意味着你必须在表中查找方法的地址(称为 vtable 或见证表),然后跳转到该位置。如果编译器确切地知道它拥有什么样的对象,例如struct、final 类或类中的final 方法,它知道该方法不能被覆盖,因此可以直接跳转到其地址而无需进行查找。
声明为static 的方法是一种类型方法。它将在类型本身而不是类型的实例上调用,即在方法内部 self 指的是类型而不是类型的实例。
static 方法不能被覆盖,所以编译器在编译时总是知道地址并且会为它们使用静态调度。不需要任何类型的哈希表或见证表。
【讨论】: