考虑以下示例:
class MyHeavyObject
{
MyHeavyObject()
{
// lots of initialisation
// ...
}
};
template<typename T>
void RegisterObject(T)
{
DoSomethingWith<T>();
}
现在,如果我打电话
RegisterObject(MyHeavyObject());
编译器是否会理解MyHeavyObject
从未实际使用并优化调用,或者是否会创建对象的实例?
我会对标准所说的内容以及编译器的实际内容感兴趣。
答案 0 :(得分:2)
我会对标准所说的内容和内容感兴趣 编译器实际上是这样做的。
只要可观察行为保持不变,就允许编译器执行任意更改。这被称为as-if rule。
当且仅当MyHeavyObject
的默认构造函数没有改变程序的可观察行为的副作用时,可以优化参数和临时值。
编译器有时很难发现 - 可能优化无副作用的代码,可能不,具体取决于它决定分析的距离,以及你的代码究竟有多复杂。
我希望Clang和GCC都能正确地优化上面的代码(假设MyHeavyObject
的默认构造函数非常简单),但我确定它会测试它。