没有vtable的C++动态调度

Fir*_*his 7 c++ compiler-construction standards compilation

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

dav*_*pfx 3

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

从 n3797 10.3/1 开始:

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

然后是很多关于什么构成overriding和 的内容final overrider

从 5.2.2/1 开始:

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

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

是的,vtable 很常见,但它们并不是硬道理。它们会消耗大量内存和速度,特别是对于多重继承。我可以轻松地想出一种不是 vtable 的机制,但速度同样快,使用更少的对象内存,但在代码或静态内存中占用更多空间。各种研究人员已经设计出了丰富的技术,有些甚至已经获得了专利。有些技术可以提供更好的类型安全性、更好的分支预测甚至更快的查找。我认为提供链接没有多大意义——您也可以轻松找到它们。

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

  • 这是 Stroustrup 本人的一篇论文,其中他给出了一个更快的 [动态转换](http://www.stroustrup.com/fast_dynamic_casting.pdf) 实现的示例。然而,我不清楚他希望如何扩展它以支持 DLL(请参阅*动态加载类*),并且我见过的大多数替代方案都受到这个问题的困扰:没有动态加载代码,一切都很容易。 (2认同)