去虚拟化叶类

C++: Devirtualize Leaf Classes

本文关键字:叶类 虚拟化      更新时间:2023-10-16

在Java, c#和D语言中,finalsealed类保证是叶子类(没有其他类继承的类)。这允许编译器对编译时类型为finalsealed的对象的方法调用进行顶层反虚拟化。

c++没有finalsealed关键字。是否有任何方法可以模拟它的行为,以便对我的继承层次结构中的叶子类进行去虚拟化?

c++ 11确实有final,尽管它是一个特殊标识符,而不是关键字。它不服务于"去虚拟化"的目的。它只是防止从派生类中派生类或在派生类中重写单个方法。

在c++中做这种事情的唯一方法是确保编译器知道静态和动态类型是相同的,并让优化器意识到不需要虚拟调用。换句话说,通过值访问对象,而不是通过引用或指针。这甚至适用于叶片类型!