Swift为什么需要见证表?


10

我正在尝试阅读Swift的实现细节,我无法确定的一件事是它的“见证表”。看起来它们是用于结构的单独vtable指针。

但是你为什么需要那个呢?结构是按值复制的,因此在编译时您已经知道它们是什么类型。那么,您是否不只是硬编码要调用的方法并完成该方法呢?为什么要对这些方法执行虚拟调度?


1
您能指出那些结构见证表上的一些资源吗?我所能找到的只是协议见证表。
约尔格W¯¯米塔格

Answers:


12

结构可以实现接口,在Swift中称为协议。您可以具有作为协议的参数,变量或字段/成员,并且由于将多个结构传递(或分配)给协议参数(或变量或字段),则可能丢失了该结构的详细信息(例如:编译时),并且协议见证表开始起作用(例如:运行时)。

您可以了解有关Swift内存布局的更多信息。


我更熟悉的C#也发生了类似的情况。将对传递或分配给接口变量或字段/成员的结构进行装箱,并且该装箱的表示形式与类表示形式的表示形式匹配,这意味着存在用于装箱的结构的vtable。

我希望C#和Swift在项目在编译时被称为结构时都可以直接调用,而在编译时将该项目仅称为接口时可以使用vtable dispatch。


1
“我希望C#和Swift都能在编译时将该项目称为结构体时直接调用”,是的,这是一个称为虚拟化
Alexander-Reinstate Monica

上面的链接不再起作用。您可能要参考github.com/apple/swift/blob/master/docs/ABI/TypeLayout.rst
马丁R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.