我在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 ++菜鸟,想要更好地理解流程。我很想知道这段代码是如何运行的,以及为什么经常调用复制构造函数。
答案 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调用。