调用构造函数的次数以及地址相同的原因

时间:2016-01-08 08:39:21

标签: c++

源代码:

#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

我的问题:

1。为什么只调用了一个构造函数?不应该调用赋值构造函数吗?

2。为什么a1和a2的地址相同?

2 个答案:

答案 0 :(得分:3)

Return Value Optimisation (RVO)是一种编译器优化,它消除了将您在get_a中创建的临时对象复制到test_1。这就是两个对象具有相同地址的原因 - 它们实际上是完全相同的对象。您的编译器正在消除冗余的构造和复制,并且只是构造结果。

答案 1 :(得分:2)

  1. 由于copy elision
  2. 因为复制省略。
  3. 编译器只是直接在调用站点分配返回值,而不是get_A()的返回值用于复制构造a2

    如果你在编译器中关闭了复制省略(GCC和Clang中的-fno-elide-constructors),你可以看到你期望的行为。