没有vtable的C ++动态调度

时间:2014-05-07 13:19:37

标签: c++ compiler-construction compilation standards

据我所知,C ++标准并不要求使用虚方法表(a.k.a.vtables)实现动态调度。尽管如此,我还是觉得vtable是事实上的标准实现。我想知道是否有使用不同机制或至少允许不同机制的C ++编译器。

1 个答案:

答案 0 :(得分:3)

C ++标准对虚函数和调用机制的实现几乎没有限制。因为它确实列出了许多不能虚拟的东西,这实际上增加了自由。

来自n3797 10.3 / 1:

  

虚函数支持动态绑定和面向对象编程。

然后很多关于什么构成overridingfinal overrider

从5.2.2 / 1开始:

  

否则[function is virtual],调用对象表达式的动态类型中的最终覆盖(10.3);这种调用称为虚函数调用。 [注意:动态类型是对象表达式的当前值引用的对象的类型...]

因此,C ++标准基于对象的动态类型定义了一种受限制的动态分派,而不是其他任何东西。只要每个对象都带有一个可以调用任何虚函数的机制,其他一切都可以用来获取。

是的,vtables很常见,但它们不是硬道理。它们是一个重要的内存和速度成本,特别是对于多重继承。我可以轻松地提出一种机制,它不是一个vtable,但速度和使用较少的对象内存,但在代码或静态内存中占用更多空间。各种研究人员拥有丰富的技术设备,有些甚至已获得专利。有些技术可以提供更好的类型安全性,或更好的分支预测甚至更快的查找速度。我没有看到提供链接的重点 - 您也可以轻松找到它们。

但不,我不知道任何使用这些机制的生产C ++编译器。也许是时候考虑一​​个了?