是否存在优化虚拟方法调用的实例?

时间:2016-08-14 09:01:10

标签: c++

例如,如果Foo()是类Bar的虚方法,则没有继承类,编译器可以在编译时推断出类型为Bar(例如。 Bar.Foo())。 由于它在编译时很清楚Bar::Foo()是调用可以解决的唯一可能的方法,编译器通常会优化虚拟方法查找吗?

1 个答案:

答案 0 :(得分:0)

删除虚拟调用的编译器优化称为devirtualisation。它要求编译器知道实例的确切类型,以便知道正在调用某个重载。

假设你有这样的类,我建议使用final来表示没有类可以继承它,或者没有继承类可以覆盖这个特定的方法。

一切都取决于你的编译器,尽管在某种程度上已经使用了它。

此优化中的一个重要因素是编译器需要知道确切的类型,并且可以推断出没有类继承它或者可以覆盖方法调用。如果该类具有隐藏的可见性,LTO可以发现方法只实现一次,但是我还没有看到任何实现。