Fir*_*his 7 c++ compiler-construction standards compilation
据我所知,C++标准不要求使用虚方法表(aka vtable)实现动态调度.尽管如此,我还是觉得vtable是事实上的标准实现.我想知道是否有使用不同机制或至少允许不同机制的C++编译器.
C++ 标准对虚函数的实现和调用机制几乎没有限制。然而,由于它确实列出了许多不能虚拟的东西,这实际上增加了自由度。
从 n3797 10.3/1 开始:
虚函数支持动态绑定和面向对象编程。
然后是很多关于什么构成overriding和 的内容final overrider。
从 5.2.2/1 开始:
否则[function is virtual],则调用其在对象表达式的动态类型中的最终重写器(10.3);这种调用称为虚函数调用。[注:动态类型是对象表达式的当前值所引用的对象的类型...]
因此,C++ 标准定义了一种基于对象动态类型的受限动态分派,仅此而已。只要每个对象都带有可以调用任何虚函数的机制,其他一切都可以争夺。
是的,vtable 很常见,但它们并不是硬道理。它们会消耗大量内存和速度,特别是对于多重继承。我可以轻松地想出一种不是 vtable 的机制,但速度同样快,使用更少的对象内存,但在代码或静态内存中占用更多空间。各种研究人员已经设计出了丰富的技术,有些甚至已经获得了专利。有些技术可以提供更好的类型安全性、更好的分支预测甚至更快的查找。我认为提供链接没有多大意义——您也可以轻松找到它们。
但不,我不知道有任何生产 C++ 编译器使用这些机制。也许是时候考虑一下了?