不记得我现在在哪里看到它 - 但在某处我读到动态多态会阻止编译器进行各种优化。
除了内联之外,还有人可以告诉我任何这种“错过的”优化机会的例子,多态性阻止编译器制作吗?
答案 0 :(得分:2)
使用:
Derived d;
d.vMethod(); // that will call Derived::vMethod statically (allowing inlining).
使用(除非在C ++ 11中将Derived
或Derived::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通常通过传递隐藏参数来实现:指向内存区域的指针,该指针用“返回”对象填充。在编译时必须完全知道该区域的大小和类型。