Vtables在大多数面向对象的实现中是无处不在的,但它们有替代方案吗?Vtables的维基页面有一小段简介,但没有太多信息(并且链接也是空的)。
您知道哪些语言实现不使用vtables吗?
是否有免费在线页面讨论这些替代方案?
Vtables在大多数面向对象的实现中是无处不在的,但它们有替代方案吗?Vtables的维基页面有一小段简介,但没有太多信息(并且链接也是空的)。
您知道哪些语言实现不使用vtables吗?
是否有免费在线页面讨论这些替代方案?
是的,有很多替代方案!
只有两个条件同时成立时才可能使用虚函数表(vtable)。
通常情况下,继承是通过具有基于字符串的表来实现的,该表将函数名称映射到其实现,并带有指针允许每个类查找其基类。然后通过遍历此结构,在接收器对象所在的类或以上位置中寻找实现该方法最低的类来实现方法调度。为了加速执行,通常会使用内联缓存等技术,其中调用站点根据对象类型存储应调用的方法的猜测,以避免花费时间遍历整个结构。 Self编程语言使用了这个想法,然后将其合并到HotSpot JVM中以处理接口(标准继承仍使用vtable)。
另一个选择是使用跟踪,其中编译器生成代码来猜测对象类型,然后将该方法硬编码到跟踪中进行调用。 Mozilla Firefox在其JavaScript解释器中使用此功能,因为没有办法为每个对象构建vtable。
我刚刚结束了一门编译器课程,并且我的其中一堂课是关于各种编程语言中对象实现及相关权衡的。如果您愿意,可以查看这里的幻灯片。
希望这有所帮助!