C++ - 通过复制行为返回
C++ - Return by copy behavior
我正在研究下面的这个小例子,只是为了更好地理解在C++中通过复制传递值的行为。
#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 get_A(A a){
cout << "beginning get_A()" << endl;
A a2;
cout << "end get_A()" << endl;
return a2;
}
int main() {
cout << "beginning main" << endl;
A a1;
A a2 = get_A(a1);
cout << "end main" << endl;
return 0;
}
Output:
beginning main
A()
A(const A& a)
beginning get_A()
A()
end get_A()
end main
为什么在打印end get_A()
之后没有A(const A& a)
,因为我是复印件返回的?
这是一种称为复制省略的优化。当你调用get_a
时,编译器正在构造局部a2
变量来代替 main 中的a2
,并省略复制/移动。
这是标准明确允许编译器执行的少数优化之一。它发生的两种情况是,当您返回具有自动存储持续时间的变量时,或者当您返回一个无名的临时变量时;虽然有一些额外的限制。
相关文章:
- 为什么当我尝试返回引用时,我的对象仍然被复制
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 像 std::list<std::p air<string, string>> 这样的结构在返回时会被复制吗?
- 使用 sftp_open() 使用 C++ 中的 SFTP libssh 将文件从本地复制到远程时,File 返回 N
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 阻止在返回时复制共享指针
- 函数返回时,带指针的复制构造函数失败
- 复制构造函数 C++ 在析构函数上返回奇怪的字母
- 将参数的省略复制为返回值
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何让"factory function"返回不可复制的对象?
- 为什么返回std::optional有时移动,有时复制
- 复制构造函数、按值传递和按值返回、链式操作、编译器
- 复制省略并在返回值中移动语义
- 以最佳方式返回复制的值
- 返回复制的对象
- 嵌入式mono:将数组从C#DLL返回/复制到C++
- C 返回复制对象
- 从具有移动语义或返回值优化的函数返回值,但不返回复制构造函数
- 如何strcpy和返回复制的字符数