例如,如果Foo()
是类Bar
的虚方法,则没有继承类,编译器可以在编译时推断出类型为Bar
(例如。 Bar.Foo()
)。
由于它在编译时很清楚Bar::Foo()
是调用可以解决的唯一可能的方法,编译器通常会优化虚拟方法查找吗?
答案 0 :(得分:0)
删除虚拟调用的编译器优化称为devirtualisation
。它要求编译器知道实例的确切类型,以便知道正在调用某个重载。
假设你有这样的类,我建议使用final
来表示没有类可以继承它,或者没有继承类可以覆盖这个特定的方法。
一切都取决于你的编译器,尽管在某种程度上已经使用了它。
此优化中的一个重要因素是编译器需要知道确切的类型,并且可以推断出没有类继承它或者可以覆盖方法调用。如果该类具有隐藏的可见性,LTO可以发现方法只实现一次,但是我还没有看到任何实现。