考虑以下示例:
class MyHeavyObject
{
MyHeavyObject()
{
// lots of initialisation
// ...
}
};
template<typename T>
void RegisterObject(T)
{
DoSomethingWith<T>();
}
现在,如果我打电话给
RegisterObject(MyHeavyObject());
编译器会理解MyHeavyObject
从未被实际使用并优化调用吗?还是会创建对象的实例?
我对标准所说的和编译器实际所做的都很感兴趣。
我会对标准的内容和内容感兴趣编译器实际上是这样做的。
只要可观察的行为保持不变,编译器就可以执行任意更改。这就是所谓的假设规则。
如果并且仅当MyHeavyObject
的默认构造函数没有改变程序可观察行为的副作用时,参数和临时构造函数可能会被优化掉。
编译器有时很难发现这一点-它可能会优化无副作用的代码,它<em]可能不会>,这取决于它决定分析的程度以及代码的实际复杂程度。
我希望Clang和GCC都能正确地优化上面的代码(假设MyHeavyObject
的默认构造函数相当简单),但我会测试它以确定。