应用std :: move后对象实例会发生什么?

问题描述 投票:4回答:5
[我试图了解std :: move和rvalues在C ++ 11中是如何工作的。在这样的教程中,我不断看到类似的示例:

假设我们有这个课程:

class Class { public: Class(Class &&b) { a = b.a; } int *a; } int main() { Class object1(5); Class object2(std::move(object1)); }

运行主功能的第二行之后,object1会发生什么?如果将object1的内存“移动”到object2,则此副本构造函数的作用是什么?正因为我们要丢失对象1的内存而只是在内存中的不同位置获得完全相同的值?这是什么用例?

Edit

:问题不是重复的。从某种意义上说,甚至没有代码段,重复候选字的范围更广。]

Edit2

:我刚刚尝试过这段代码:class trial { public: trial() { a = (int*)malloc(4); } trial(trial& rv) { this->a = rv.a; rv.a = NULL; } int *a; }; int main() { cout << "Program Started" << endl; trial a1; trial a2(a1); return 0; }
而且我已经检查了a1和a2的内部。用此代码可以得到完全相同的结果:

class trial { public: trial() { a = (int*)malloc(4); } trial(trial&& rv) { this->a = rv.a; rv.a = NULL; } int *a; }; int main() { cout << "Program Started" << endl; trial a1; trial a2(std::move(a1)); return 0; }

区别在于复制构造函数,其中之一不使用移动语义。只是对象的简单参考。如果我们也通过引用传递,则不会发生复制,但是通过执行rv.a = NULL,我们将不得不丢失第一个对象,以避免通过释放a2来意外释放a1的内存。所以我设置了rv.a = NULL

[当我使用类试用版的右值复制构造函数,但不使用右值构造函数中的行rv.a = NULL时,当我放个中断时,整数指针aa1a2中都显示相同的地址指向return 0行。那么,这与通过引用传递的方式有何不同?看起来我们可以通过引用传递完全相同。

[我试图理解std :: move和rvalues在C ++ 11中是如何工作的。在这样的教程中,我不断看到类似的示例:假设我们有这个类:class Class {public:Class(...

c++ std move-semantics
5个回答
5
投票
没事。

std::move不会移动任何东西。它只是将对象强制转换(转换)为右值引用,这可以通过查看典型实现来看到:


1
投票
应用std :: move后对象实例会发生什么?“

0
投票
例如,典型的用例是避免复制大资源(例如成员std::vector)。没有移动语义,它将被复制。有了它,移动基本上就是指针交换,它可以快得多。

0
投票
std::move将使包括内存在内的资源所有权从对象1转移到对象2。因此,您的移动副本构造函数或移动分配运算符可以启动资源传输。因此,如果object1是可移动的,那么obj1的资源现在将是object2的资源。

0
投票
std::move返回基于所提供对象的右值引用。现在可以将此新创建的右值引用传递给将右值引用作为参数的函数,例如void foo (Obj&& rvalue_reference)
© www.soinside.com 2019 - 2024. All rights reserved.