vtable替代方案

10

Vtables在大多数面向对象的实现中是无处不在的,但它们有替代方案吗?Vtables的维基页面有一小段简介,但没有太多信息(并且链接也是空的)。

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

是否有免费在线页面讨论这些替代方案?

1个回答

18

是的,有很多替代方案!

只有两个条件同时成立时才可能使用虚函数表(vtable)。

  1. 所有方法调用可以在编译期间确定。 如果您可以通过字符串名称调用函数,或者没有有关正在调用方法的对象类型信息,则无法使用vtable,因为您无法将每个方法映射到某个表中的索引。同样,如果您可以在运行时向类添加函数,则不能静态分配vtable中所有方法的索引。
  2. 继承关系可以在编译期间确定。如果您使用原型继承或另一种继承方案,在静态情况下无法确定继承结构的外观,也就无法预先计算表中每个方法的索引或特定类的方法放在哪个槽中。

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

另一个选择是使用跟踪,其中编译器生成代码来猜测对象类型,然后将该方法硬编码到跟踪中进行调用。 Mozilla Firefox在其JavaScript解释器中使用此功能,因为没有办法为每个对象构建vtable。

我刚刚结束了一门编译器课程,并且我的其中一堂课是关于各种编程语言中对象实现及相关权衡的。如果您愿意,可以查看这里的幻灯片。

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接