gpt4 book ai didi

c++ - C++中局部变量和返回变量的构造和析构

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:00 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;

class A {
public:
A() {
cout << "A()" << endl;
}
A(const A& a) {
cout << "A(const A& a)" << endl;
}
A(A&& a) {
cout << "A(A&& a)" << endl;
}
A& operator=(const A& a) {
cout << "operator=(const A& a)" << endl;
return *this;
}
A& operator=(A&& a) {
cout << "operator=(A&& a)" << endl;
return *this;
}
~A() {
cout << "~A()" << endl;
};
};

A foo() {
A a;
return a;
}

int main() {
A a = foo();
}

编译:

clang++ test.cpp -o test -std=c++11

输出:

A()
~A()

为什么输出中只有一对 A() 和 ~A() ?

为什么不调用移动构造函数?

编译器是否做了一些代码优化?

最佳答案

由于 Copy Elision,未调用移动(或复制)构造函数.编译器直接在返回值处构造局部变量。

此类优化也称为 RVO(返回值优化)。

编译器在某些条件下允许进行此类优化,这些条件在标准中有所提及。但引用 Effective Modern C++ by Scott Meyers 的第 25 项可能更方便关于这些条件(不像标准中那样严格的信息,但可能更有效地吸收):

Paraphrasing the legalistic (arguably toxic) prose of the Standard, [...] compilers may elide the copying (or moving) of a local object in a function that returns by value if (1) the type of the local object is the same as that returned by the function and (2) the local object is what’s being returned.

关于c++ - C++中局部变量和返回变量的构造和析构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com