理解复制对象
Understanding copying objects
我写的是:
#include <iostream>
struct A
{
int a;
int b;
A() : a(10) { std::cout << "default ctor" << std::endl;}
~A(){ }
A(const A&){ std::cout << "copy ctor" << std::endl; }
A(const A&&){ std::cout << "move ctor" << std::endl; }
};
A init()
{
A a;
a.b = 20;
return a;
}
int main()
{
A a = init();
std::cout << a.b << std::endl;
}
我期望A a = init()
施加move-构造函数调用,但输出是:
default ctor
20
演示A a = init();
由NRVO
内联。它通过在代码段中使用对象的默认构造函数来创建对象:
A a;
此处不使用move构造函数。
此处的move构造函数可以与-fno-elide-constructors
编译器标志一起使用。我已经修改了您的示例,以便使用此标志进行编译。但是请注意,默认构造函数将始终被调用,因为NRVO
在代码中不会影响它。NRVO
只意味着对象将在它需要的存储中构造(而不是在init
方法的堆栈上),因此它不会被移动或复制。如果使用no-elide标记,则不能在那里创建它,因此它将被复制/移动到那里。
相关文章:
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 了解在 C++ 中分配容器时的对象复制
- C++类对象复制构造函数和运算符=
- 复制 elision/RVO 会导致从同一对象复制/移动吗?
- 如何在循环内将大对象复制到omp任务中?
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 无法将类构造函数中新创建的对象复制到 C++ 中的向量成员
- 将C++对象复制到指向新指针的指针处
- 将一个 OpenCV OutputArrayOfArrays 对象复制到另一个对象
- 选择性地禁用隐式对象复制
- 不能从文件到指针向量的对象复制
- 从派生对象复制构造
- OpenCV Mat对象复制速度更快
- 将子对象复制到父对象
- 为什么普通的 c++ 编译器不优化对象复制?
- C :将一个对象复制到构造函数中的另一个对象
- 使用命名对象复制构造函数
- 不必要的对象复制 - C++ STL
- 如何将一个类的对象复制到另一个类中