【发布时间】:2014-05-15 18:34:31
【问题描述】:
在派生类中调用虚函数以便编译器可以内联或以其他方式优化调用的最佳方法是什么?
例子:
class Base {
virtual void foo() = 0;
};
class Derived: public Base {
virtual void foo() {...}
void bar() {
foo();
}
};
我希望在bar() 中对foo() 的调用始终调用Derived::foo()。
据我了解,调用将导致 vtable 查找,编译器无法优化它,因为可能有另一个类继承自 Derived。
我可以显式调用Derived::foo(),但如果Derived 中有许多虚函数调用,那会变得冗长。我还发现令人惊讶的是,我在网上找不到很多材料来解决我认为常见的情况(调用虚方法的“最终”派生类),所以我想知道我是否在这里滥用虚函数或过度优化。
这应该怎么做?停止过早优化并坚持使用foo(),吸干它并使用Derived::foo(),还是有更好的方法?
【问题讨论】:
-
我认为你的最后一行总结得很好。
-
如果你知道什么都不会覆盖
foo(),那么声明它final。见:stackoverflow.com/questions/8824587/… -
你有没有测量过编译器是否真的已经为你优化了?
-
哦,太棒了。
final正是我想要的。我不知道它存在于 C++ 中。 -
我不认为 final 给你更多的优化可能性。编译器仍然必须确定层次结构中是否有另一个类覆盖 foo,它只是说层次结构中没有类。如果编译器可以对 final 方法执行此操作并对其进行去虚拟化,那么在没有 final 的情况下也应该可以。
标签: c++ inheritance optimization virtual inline