多态性阻止编译器优化的例子?

时间:2014-02-10 23:37:02

标签: c++ gcc optimization compiler-construction polymorphism

不记得我现在在哪里看到它 - 但在某处我读到动态多态会阻止编译器进行各种优化。

除了内联之外,还有人可以告诉我任何这种“错过的”优化机会的例子,多态性阻止编译器制作吗?

2 个答案:

答案 0 :(得分:2)

使用:

Derived d;
d.vMethod(); // that will call Derived::vMethod statically (allowing inlining).

使用(除非在C ++ 11中将DerivedDerived::vMethod中的一个声明为final):

void foo(Derived& d)
{
    d.vMethod(); // this will call virtually vMethod (disallowing inlining).
}

虚拟通话需要额外费用(通过vtable的间接费用)。

C ++ 11引入了final关键字,这可能会打开静态调用中的最后一个示例。

答案 1 :(得分:0)

至少在C ++中,多态对象必须采用指针或引用的形式。有时这会阻止将它们放在堆栈变量或List类型上的可能性,您需要使用List。堆栈变量备用动态分配等。

对Poly.vmethod()的调用始终在编译时解析,即使vmethod()是虚拟的,而Poly-> vmethod()也会参考虚方法表。 (好吧,如果方法是虚拟的,那就意味着它是多态的。静态方法在任何一种情况下都是静态解决的。)

返回值优化(RVO)是返回指针或引用时没有的另一个技巧。 RVO通常通过传递隐藏参数来实现:指向内存区域的指针,该指针用“返回”对象填充。在编译时必须完全知道该区域的大小和类型。