源代码:
#include <iostream>
#include <string>
using namespace std;
int counts = 0;
class A {
public:
A() {
cout << ">> A(" << ++counts << ") constructor" << endl;
}
A(const A& a) {
cout << ">> A(" << ++counts << ") copy constructor" << endl;
}
A& operator=(const A& a) {
cout << ">> A(" << ++counts << ") = constructor" << endl;
return *this;
}
};
A get_A()
{
A a1;
cout << "address of a1 = " << &a1 << endl;
return a1;
}
void test_1()
{
A a2 = get_A();
cout << "address of a2 = " << &a2 << endl;
}
int main()
{
test_1();
return 0;
}
输出:
>> A(1) constructor
address of a1 = 0x7fff5296daf8
address of a2 = 0x7fff5296daf8
我的问题:
答案 0 :(得分:3)
Return Value Optimisation (RVO)是一种编译器优化,它消除了将您在get_a
中创建的临时对象复制到test_1
。这就是两个对象具有相同地址的原因 - 它们实际上是完全相同的对象。您的编译器正在消除冗余的构造和复制,并且只是构造结果。
答案 1 :(得分:2)
编译器只是直接在调用站点分配返回值,而不是get_A()
的返回值用于复制构造a2
。
如果你在编译器中关闭了复制省略(GCC和Clang中的-fno-elide-constructors
),你可以看到你期望的行为。