标签调度对象是否实际实例化了?

时间:2014-10-03 18:44:14

标签: c++ oop polymorphism language-lawyer compiler-optimization

考虑以下示例:

class MyHeavyObject
{
    MyHeavyObject()
    {
        // lots of initialisation
        // ...
    }
};

template<typename T>
void RegisterObject(T)
{
    DoSomethingWith<T>();
}

现在,如果我打电话

RegisterObject(MyHeavyObject());

编译器是否会理解MyHeavyObject从未实际使用并优化调用,或者是否会创建对象的实例?

我会对标准所说的内容以及编译器的实际内容感兴趣。

1 个答案:

答案 0 :(得分:2)

  

我会对标准所说的内容和内容感兴趣   编译器实际上是这样做的。

只要可观察行为保持不变,就允许编译器执行任意更改。这被称为as-if rule

当且仅当MyHeavyObject的默认构造函数没有改变程序的可观察行为的副作用时,可以优化参数和临时值。

编译器有时很难发现 - 可能优化无副作用的代码,可能不,具体取决于它决定分析的距离,以及你的代码究竟有多复杂。
我希望Clang和GCC都能正确地优化上面的代码(假设MyHeavyObject的默认构造函数非常简单),但我确定它会测试它。