Vtable在大多数OO实现中无处不在,但是它们有替代方案吗? vtables的Wiki页面上有简短的内容,但实际上并没有太多信息(和 stub 链接)。

您知道一些不使用vtables的语言实现吗?

有免费的在线页面讨论替代方法吗?

最佳答案

是的,有很多选择!

仅当同时满足两个条件时,才可以使用Vtables。

  • 所有方法调用都可以静态确定。 如果可以按字符串名称调用函数,或者没有关于要在其上调用方法的对象的类型信息,则不能使用vtables,因为无法将每个方法映射到某个表中的索引。同样,如果可以在运行时将函数添加到类中,则不能在vtable中为所有方法静态分配索引。
  • 继承可以静态确定。 如果使用原型(prototype)继承或无法静态告诉继承结构的其他继承方案,则无法预先计算表中每个方法的索引或特定类的方法在插槽中的位置。

  • 通常,继承是通过将函数名称映射到其实现的基于字符串的表以及允许每个类查找其基类的指针来实现的。然后,通过遍历此结构在实现该方法的接收器对象的类之上或之上寻找最低类,来实现方法分派(dispatch)。为了加快执行速度,经常使用内联缓存之类的技术,其中调用站点根据对象的类型来存储应该调用哪种方法的猜测,以避免花费时间遍历整个结构。 Self编程语言使用了这种想法,然后将其合并到HotSpot JVM中以处理接口(interface)(标准继承仍使用vtables)。

    另一个选择是使用跟踪,在该跟踪中,编译器发出的代码会猜测对象的类型,然后对要调用的方法进行硬编码。 Mozilla Firefox在其JavaScript解释器中使用了此功能,因为没有一种方法可以为每个对象构建vtable。

    我刚完成一门编译器类(class)的教学,而我的讲座之一是关于各种编程语言中对象的实现以及相关的折衷方法。如果愿意,您可以查看幻灯片here

    希望这可以帮助!

    09-18 10:03