原始代码
#include <iostream>
int global;
struct A
{
A(){}
A(const A&x){
++global;
}
~A(){}
};
A foo()
{
A a;
return a;
}
int main()
{
A x = foo();
std::cout << global;
}
输出将0
在支持命名返回值优化的优化编译器上。
当我将定义更改foo
为
A foo()
{
{
A a;
return a;
}
}
我得到1
作为输出,即复制 c-tor 被调用一次。可能的原因是什么?引入虚拟作用域会完全改变代码的行为。我错过了什么?
我在 g++ 编译器上对其进行了测试。这里有任何编译器人员可以以某种特定于实现的方式解释该场景吗?
编辑
我在 clang 上对其进行了测试,即使在第二种情况下,它也优化了对复制 c-tor 的调用。
Andrew Pinski(gcc 专家)证实这确实是 g++ 错过优化的一个案例。