Agn*_*ian 1 c++ inheritance language-design vtable
例如,为什么没有语言支持来检查vtable?为什么我不能用新的成员函数替换成员函数?我有一种直觉,认为有很多方法可以很好地利用这些功能.
有没有其他语言可以让我做这些事情?
主要原因是保持vtable作为实现细节允许任何具体实现在其认为合适时优化它; 这意味着如果能够证明对给定方法(或所有方法)没有虚拟调用,它可以完全修剪甚至消除vtable.或者它可以用if-else类型检查替换vtable调度,例如,如果它看到只有几个替代品(这可能是有利的,因为分支预测在这种情况下会起作用,但不适用于vtables,也因为if-else然后可以内联分支).它可以对vtable中的方法进行重新排序,使得最常见的方法更早出现,或者使那些通常被称为一个接一个的方法填充vtable中的相邻插槽以利用缓存.等等等等.当然,
同样,vtable并不像听起来那么简单.例如,编译器通常必须生成thunks来修复this指针,例如虚拟继承,或者多重继承与协变返回类型相结合.这也是没有"单一最佳方式"去做的事情(这就是为什么不同的编译器以不同的方式做到这一点),并且标准化它将有效地需要以特定方式进行解决.
也就是说,"vtable切换"是一种潜在有用的技术,如果作为更高级别的构造公开(这样仍然可以进行优化).有关示例,请参阅UnrealScript,它允许用户定义多个状态对于一个类(一个默认,另一个命名),并覆盖命名状态中的一些方法.派生类可以覆盖现有状态中的更多方法,或者添加它们自己的状态并覆盖它们.此外,状态可以扩展其他状态(因此,如果某个方法没有被覆盖特定状态,则它会回退到"父"状态,依此类推,直到链达到默认状态).对于演员建模(游戏本质上是这些),这一切都很有意义,这就是UnrealScript拥有它的原因.所有这一切的明显有效的实现机制是vtable切换,每个状态都有一个单独的vtable.