在以下代码中,它打印出两个不同的内存位置。当我按价值回归时,这对我来说很有意义。
#include <iostream>
using namespace std;
class Foo {
public:
Foo () {}
// Foo (const Foo &) { cout << "Copy con" << endl; }
};
Foo test () {
Foo foo;
cout << &foo << endl;
return foo;
}
int main () {
Foo foo = test();
cout << &foo << endl;
}
但是,如果我在上面的代码中取消注释复制构造函数并再次运行它,它会输出两次相同的内存位置。为什么?它根本不会打印出“复制con”,所以我知道没有调用复制构造函数。似乎仅仅存在复制构造函数会导致某种优化,即使它没有被调用。
我正在使用GCC 4.6.3上的“g ++ -Wall test.cpp -o test”进行编译。
答案 0 :(得分:2)
这是return value optimization的结果。基本上,您的编译器省略了由return语句导致的昂贵的复制操作,即使复制构造函数有副作用。
这背后的原因是返回一个复杂的对象是很容易的。编译器不会浪费时间进行复制,而是在调用者的堆栈帧中秘密创建一个隐藏对象,并将对该隐藏对象的引用传递给被调用函数,并将函数的返回值直接复制到那个隐藏的物体。
C ++标准明确规定了这一点(ISO-IEC 14882:2011 12.8第31段):
当满足某些条件时,允许省略实现 复制/移动类对象的构造,即使复制/移动 对象的构造函数和/或析构函数有副作用。