考虑以下示例:

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

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

现在,如果我打电话
RegisterObject(MyHeavyObject());

编译器会理解MyHeavyObject从未真正使用过并优化调用吗,还是会创建该对象的实例?

我会对标准说什么以及编译器实际做什么都感兴趣。

最佳答案



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

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

有时,编译器很难发现这一点-它可能会优化无副作用的代码,但可能不会,这取决于它决定分析的距离以及代码的实际复杂程度。
我希望Clang和GCC都能正确优化上述代码(假设MyHeavyObject的默认构造函数相当简单),但我会对其进行测试以确保确定。

09-25 16:31