复制构造函数在哪里被调用?

时间:2016-10-15 01:55:13

标签: c++ g++ copy-constructor

我在main.cpp文件中写了一小段C ++代码,并试图了解它是如何工作的。

首先我定义了一个“值”类:

#include <algorithm>
#include <iostream>

using namespace std;

class Value {

  int v;

 public:

  Value(int v): v(v) {
    cout << "Ctor called" << endl;
  }

  Value(const Value &rhs): v(rhs.v) {
    cout << "Copy Ctor called. V = " << v << endl;
  }

  Value& operator =(const Value &rhs) {
    cout << "Assignment called" << endl;
    if (this != &rhs) {
      auto tmp = Value(rhs);
      swap(v, tmp.v);
    }
    return *this;
  }

  int rawValue() const {
    return v;
  }

};

然后我执行了main:

Value doubleValue(const Value &v) {
  auto newValue = Value(v.rawValue() * 2);
  return newValue;
}

int main() {
  cout << "Creating v = 10" << endl;
  auto v = Value(10);

  cout << "Creating v = 20" << endl;
  auto v2 = doubleValue(v);

  return 0;
}

我正在使用g ++作为我的编译器,当我运行以下代码时:

g++ --std=c++11 -fno-elide-constructors -c main.cpp
g++ main.o -o main.exe
./main.exe

打印以下内容:

Creating v = 10
Ctor called
Creating v = 20
Ctor called

我再次编译代码,但没有复制构造函数进行优化:

g++ --std=c++11 -fno-elide-constructors -c main.cpp
g++ main.o -o main.exe
./main.exe

现在,它打印以下内容:

Creating v = 10
Ctor called
Copy Ctor called. V = 10
Creating v = 20
Ctor called
Copy Ctor called. V = 20
Copy Ctor called. V = 20
Copy Ctor called. V = 20

不确定为什么它会多次调用复制构造函数。我是一个C ++菜鸟,想要更好地理解流程。我很想知道这段代码是如何运行的,以及为什么经常调用复制构造函数。

2 个答案:

答案 0 :(得分:3)

以下是副本:

  • auto v = Value(10);使用v中的copy-constructor初始化Value(10)
  • auto newValue = Value(v.rawValue() * 2);使用newValue中的copy-constructor初始化Value(v.rawValue()*2)
  • return newValue;使用newValue中的copy-constructor初始化返回值
  • auto v2 = doubleValue(v);使用返回值中的copy-constructor初始化v2

所有这些都是复制省略的背景。

答案 1 :(得分:1)

了解Return value optimization (RVO)。如果RVO关闭,则会经常调用复制构造函数。例如,如果启用了RVO,则代码auto v = Value(10);将忽略复制ctor调用。