protocol A {
func f()
}
struct S1 : A {
func f() {
print("S1")
}
}
struct S2 : A {
func f() {
print("S2")
}
}
let array: [A] = [S1(), S2()]
for s: A in array {
s.f()
}
// "S1\n" "S2\n"
如果这是一个继承层次结构,我希望Swift使用v-table来查找正确的实现。但是,array
中的具体类型可以是实现A
的任何内容,以及任意数量的其他协议,因此如果对象的结构也使用v-table,Swift运行时如何知道它的结构? ?
答案 0 :(得分:3)
Swift运行时使用Protocol Witness Table,它保存了指向每种类型协议方法实现的指针。
Mike Ash在他的文章Exploring Swift Memory Layout, Part II中解释得最好:
最后一个,在偏移32处是一个"协议见证表"对于底层类型和协议,它包含指向协议方法的类型实现的指针。这就是编译器如何在协议类型的值上调用方法(如p())而不知道运行时的基础类型。
我还会按照Hamish的评论中的建议观看WWDC视频Understanding Swift Performance。