考虑以下示例:
class MyHeavyObject
{
MyHeavyObject()
{
// lots of initialisation
// ...
}
};
template<typename T>
void RegisterObject(T)
{
DoSomethingWith<T>();
}
现在,如果我打电话
RegisterObject(MyHeavyObject());
编译器会理解
MyHeavyObject
从未真正使用过并优化调用吗,还是会创建该对象的实例?我会对标准说什么以及编译器实际做什么都感兴趣。
最佳答案
只要可观察到的行为保持不变,就允许编译器执行任意更改。那就是as-if rule。
当且仅当MyHeavyObject
的默认构造函数没有任何副作用可以改变程序的可观察行为时,才可以优化参数和临时变量。
有时,编译器很难发现这一点-它可能会优化无副作用的代码,但可能不会,这取决于它决定分析的距离以及代码的实际复杂程度。
我希望Clang和GCC都能正确优化上述代码(假设MyHeavyObject
的默认构造函数相当简单),但我会对其进行测试以确保确定。