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
,以及许多其他协议,那么如果 Swift 运行时也使用 v-tables,它如何知道对象的结构呢?
Swift 运行时使用协议见证表,其中保存指向协议方法的每种类型的实现的指针。
迈克·阿什(Mike Ash)在他的文章中对此做了最好的解释探索 Swift 内存布局,第二部分:
最后一个位于偏移量 32 处,是基础类型和协议的“协议见证表”,其中包含指向协议方法的类型实现的指针。这就是编译器能够在运行时不知道底层类型的情况下对协议类型的值调用方法(例如 p())的方式。
我也会观看 WWDC 视频了解 Swift 性能正如哈米什评论中所建议的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)