【问题标题】:Difference between move operator= and copy operator=移动运算符 = 和复制运算符 = 之间的区别
【发布时间】:2015-12-09 04:20:04
【问题描述】:

考虑这段代码:

#include <iostream>
using namespace std;

class A
{
int x;
public:
A () {x=5;}
A (const A & a) {x=a.x;}
A (A && a) {x=move(a.x);}
A & operator= (const A & a) {x=a.x;}
A & operator = (A && a) {x=move(a.x);}

void func () {A a; *this=move(a);}

}; 

int main () {A a; a.func();}

A::func() 创建一个 A 对象,然后使用移动 operator=*this 分配给 A。在该作业中移动operator= 和复制operator= 有什么区别? 当我要复制的对象将在函数结束时过期时,显式使用移动赋值运算符(使用move)而不是复制运算符是否更有效? 如果我使用移动赋值运算符,赋值后a 是否仍然存在?

【问题讨论】:

  • 这不是一个很好的例子,因为移动 int 只是复制它,使它们实际上是相同的操作。
  • 另外,您在移动构造函数中使用移动赋值,而不是直接移动。您正在移动int,所以没关系。但这对于其他类型可能很重要,而且无论如何这似乎很奇怪。

标签: c++ copy move-semantics assignment-operator


【解决方案1】:

您的问题“使用移动分配是否更有效”有点倒退。当移动分配更有效率时,您可以使用它。

如果您认为可以比复制分配“更好”地实现移动分配,则可以添加另一个运算符。

如果像您的示例一样,您发现很难优化复制int 的操作,您不必费心移动。

【讨论】:

  • 我也有类似的情况,但涉及到更重的物体。我尝试使用移动赋值运算符,因为我认为移动而不是释放然后创建新内存(这是我的复制赋值运算符所做的)会更有效,因为我移动的对象(如在前面的代码中)将expire ad 函数的结束。我想知道我的想法是否正确,或者搬家是否会产生问题。
【解决方案2】:

如果复制操作很昂贵(假设您有重成员)- 使用 move 是有意义的(例如,您可以只复制重成员上的指针)。

Move Constructor移动构造函数的目的是尽可能快地从原始对象中窃取尽可能多的资源,因为原始对象不再需要具有有意义的值,因为它将无论如何都会被销毁(或有时分配给)。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2010-12-30
    • 2017-12-25
    • 1970-01-01
    • 2016-05-18
    • 2011-10-22
    • 2012-10-06
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多