C++;无vtables的动态调度 据我所知,C++标准不需要使用虚拟方法表(Ack.VTABLE)来实现动态调度。然而,我得到的印象是vtables是事实上的标准实现。我想知道是否有C++编译器使用不同的机制,或者至少允许不同的机制。 < P> C++对虚拟函数和调用机制的实现没有多少限制。然而,由于它确实列出了许多不能虚拟的东西,这实际上增加了自由

C++;无vtables的动态调度 据我所知,C++标准不需要使用虚拟方法表(Ack.VTABLE)来实现动态调度。然而,我得到的印象是vtables是事实上的标准实现。我想知道是否有C++编译器使用不同的机制,或者至少允许不同的机制。 < P> C++对虚拟函数和调用机制的实现没有多少限制。然而,由于它确实列出了许多不能虚拟的东西,这实际上增加了自由,c++,compiler-construction,compilation,standards,C++,Compiler Construction,Compilation,Standards,从n3797 10.3/1开始: 虚拟函数支持动态绑定和面向对象编程 然后是关于什么构成了重写和最终重写器 从5.2.2/1开始: 否则[函数为虚函数],调用对象表达式动态类型中的最终重写器(10.3);这种调用称为虚拟函数调用。[注意:动态类型是由对象表达式的当前值引用的对象类型…] 因此,C++标准定义了一种基于对象的动态类型的受限动态调度,而没有别的。只要每个对象都有一个可以调用任何虚拟函数的机制,其他的一切都可以得到 是的,vtables很常见,但它们不是最后一个词。它们是一个巨大的内存

从n3797 10.3/1开始:

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

然后是关于什么构成了
重写
最终重写器

从5.2.2/1开始:

否则[函数为虚函数],调用对象表达式动态类型中的最终重写器(10.3);这种调用称为虚拟函数调用。[注意:动态类型是由对象表达式的当前值引用的对象类型…]

因此,C++标准定义了一种基于对象的动态类型的受限动态调度,而没有别的。只要每个对象都有一个可以调用任何虚拟函数的机制,其他的一切都可以得到

是的,vtables很常见,但它们不是最后一个词。它们是一个巨大的内存和速度成本,特别是对于多重继承。我可以很容易地提出一种机制,它不是vtable,但速度同样快,使用的对象内存更少,但在代码或静态内存中占用更多空间。各种各样的研究人员发明了大量的技术,有些甚至获得了专利。有一些技术可以提供更好的类型安全性、更好的分支预测或更快的查找。我不认为提供链接有什么意义——你也可以很容易地找到它们


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

不,因为vtable是最有效的方法。@Alex,高效是主观的。我同意,在一般情况下,vtable可能是最平衡的解决方案,但它不是最快的,因此我可以很容易地想象一个小编译器,它更喜欢更快的代码,但编译速度较慢,图像更大。@FireAphis:不过,就您的平均CPU而言,很难想象有什么比某种函数表方法更快的了,这就是我对vtable的看法。Andrei Alexandrescu谈到了如何实现您自己的固有机制,以优化某些架构上的函数指针查找(它仍然是一个vtable,只是以特定的方式组织):(如果您认为“vtable…不是最快的”,您可以跳过大约32分钟的讨论),那么你应该提出一个替代方案,最好是在你的问题中。加速调用的一种方法是去虚拟化,这是由大多数现代C++编译器执行的优化(并且它易于谷歌、提示、提示);我相信,如果启用LTO,使用clang和gcc可以获得更好的结果。然而,我不清楚他希望如何扩展它以支持DLL(请参阅动态加载的类),我看到的大多数替代方案都有这个问题:没有动态加载的代码,一切都很容易。@MatthieuM.:因此,可能编译器可以实现更快的机制,只要它提供了一个始终有效的方法,并掩盖了差异。编译器编写者的生活并没有变得更简单,是吗。