【问题标题】:Alternatives to vtablevtable 的替代品
【发布时间】:2011-10-24 05:34:27
【问题描述】:

Vtable 在大多数 OO 实现中无处不在,但它们有替代方案吗? vtables 的 wiki 页面有一个简短的介绍,但信息并不多(和存根链接)。

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

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

【问题讨论】:

    标签: programming-languages methods virtual vtable


    【解决方案1】:

    是的,有很多选择!

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

    1. 所有方法调用都可以静态确定。如果您可以通过字符串名称调用函数,或者如果您没有关于调用方法的对象的类型信息,则不能使用 vtables,因为您可以t 将每个方法映射到某个表中的索引。同样,如果您可以在运行时向类添加函数,则不能静态地为 vtable 中的所有方法分配索引。
    2. 可以静态确定继承。如果您使用原型继承,或者您无法静态判断继承结构是什么样的其他继承方案,则无法预先计算表中每个方法的索引或者某个特定类的方法放入一个槽中。

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

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2012-01-25
      • 2015-08-05
      • 2011-01-01
      • 2011-05-31
      • 2023-03-21
      相关资源
      最近更新 更多