【问题标题】:Move assignment operator vs copy assignment operator [duplicate]移动赋值运算符与复制赋值运算符[重复]
【发布时间】:2017-11-21 00:26:05
【问题描述】:

我看到了这个:question

但是对于像我这样的 C++ 新手来说,答案非常很复杂。如果有人可以帮助我,我会很高兴。

CLASSA & operator=(CLASSA && other); //move assignment operator

CLASSA & operator=(CLASSA  other); //copy assignment operator

我仍然不明白为什么我们需要这两个?他们基本上做同样的事情?那么有什么区别,你会在哪里使用一个而不是另一个?

【问题讨论】:

  • 不是答案,但复制分配应该将const CLASSA &other 作为参数。
  • 在实现移动赋值运算符时,您可以利用 other 变量已知是临时变量并且即将被销毁(从调用返回时)这一事实。因此,如果您愿意,您可以利用这一点并“窃取”它的内容,而不是复制它们。只要你让other 处于有效状态(这样它就可以被彻底销毁),任何代码都不会知道你做了什么。
  • 只有当他们做同样的事情时,你才需要两者。

标签: c++


【解决方案1】:

首先,复制赋值运算符通常使用“const CLASSA &”作为参数,而不是简单的“CLASSA”。

通常,move有2个用例:

  1. 优化:复制成本高,移动成本低。例如,对于 std::string 的典型实现,它可以很便宜地移动。复制更昂贵(内存分配+复制)。例如,当std::vector<std::string> 需要增长时,可以使用移动。在过去(当没有 rval ref 存在时),std::vector<std::string> grow 是这样实现的:分配一个新的更大的区域,然后 copy(慢)字符串到新位置,然后在老地方。现在,有了可用的 rval 引用,就会发生这种情况:分配一个新的更大区域,然后 移动(快速)字符串到新位置。
  2. 设计禁止复制,但可以移动。例如,std::unique_ptr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2020-05-16
    • 2017-04-19
    • 2011-11-16
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多