vtable的替代品

时间:2011-08-10 15:47:17

标签: programming-languages methods virtual vtable

Vtables在大多数面向对象的实现中无处不在,但他们有其他选择吗? vtables的wiki页面有一个简短的模糊,但不是很多信息(和存根链接)。

你知道一些不使用vtable的语言实现吗?

是否有免费的在线网页讨论替代方案?

1 个答案:

答案 0 :(得分:14)

是的,还有很多选择!

Vtable只有在两个条件成立时才有可能。

  1. 可以静态确定所有方法调用。如果可以通过字符串名称调用函数,或者如果没有关于调用方法的对象的类型信息,则不能使用vtables,因为您无法将每个方法映射到某个表中的索引。同样,如果您可以在运行时向类添加函数,则无法静态地为vtable中的所有方法分配索引。
  2. 可以静态确定继承。如果您使用原型继承或其他继承方案,您无法静态地告诉继承结构是什么样的,则无法预先计算每个方法的索引在表格中或特定类的方法在插槽中。
  3. 通常,继承是通过将基于字符串的表映射到其实现的函数名称以及允许每个类查找其基类的指针来实现的。然后通过遍历该结构来实现方法分派,该结构寻找实现该方法的接收器对象的类或其上方的最低类。为了加速执行,通常使用内联缓存等技术,其中调用站点存储基于对象类型应调用哪个方法的猜测,以避免花费时间遍历整个结构。自编程语言使用了这个想法,然后将其合并到HotSpot JVM中以处理接口(标准继承仍然使用vtable)。

    另一种选择是使用跟踪,其中编译器发出代码来猜测对象的类型,然后硬编码方法以调用跟踪。 Mozilla Firefox在其JavaScript解释器中使用它,因为没有办法为每个对象构建vtable。

    我刚刚完成了编译器课程的教学,我的一个讲座是关于各种编程语言中对象的实现以及相关的权衡。如果您愿意,可以查看幻灯片here

    希望这有帮助!