【问题标题】:How copy constructor and move constructor work复制构造函数和移动构造函数如何工作
【发布时间】:2018-09-23 21:38:32
【问题描述】:

我的问题是要了解这两个构造函数究竟是如何工作的。 我有这门课:

class moveClass
{
  int variabile;
  public:
  moveClass(){} 
      //move constructor
  moveClass(moveClass && arg)
  {
    cout<<"Call move constructor"<<endl;
    variabile = arg.variabile;
  } 
      //copy constructor
  moveClass(const moveClass & arg)
  {
    cout<<"Call copy constructor"<<endl;
    variabile = arg.variabile;
  }  
};

据我了解,当我实例化此类的新对象时,会根据参数的类型调用构造函数。

移动构造函数的优点是,当使用右值实例化一个对象时,该对象不会被复制,而只是被移动。

1 moveClass a;
2 moveClass b = a;
3 moveClass c = std::move(a);

考虑到这个例子,我可以说当我实例b时,a被复制,然后分配给b?

换句话说,直到第 2 行,我将在内存中有 3 个对象: a、b 和 a_copy。

而第 3 行将只创建 c 对象并且没有新的复制对象。

基本上在这三行的末尾,我将在内存中拥有 4 个对象。 这是正确的吗?

构造函数的代码也是一样的,所以我希望唯一的区别是传递的参数的类型。

【问题讨论】:

  • 使用int作为被移动的成员会失败,因为它不能被移动,所以生成的代码只会复制它,不会看到任何差异或获得性能。跨度>

标签: c++ copy-constructor move-semantics


【解决方案1】:

换句话说,直到第 2 行,我将在内存中拥有 3 个对象:a、b 和 a_copy。

没有。

moveClass b = a;

和

一样
moveClass b(a);

所以,b 的复制构造函数被调用,您直接将成员从a 复制到b,不会生成临时(复制)。

最后你只构建了 3 个对象,a、b 和 c。

【讨论】:

  • 您好,感谢您的回复。那么使用移动构造函数有什么意义呢?只有当我的班级中有一些指针时,我才会看到不同之处吗?
  • 嗨,内森,我已经读过了。我可以看到他如何将数据指向一个空指针。所以移动构造函数是我只能用指针看到的东西?或者只是那个变量不会在第三行初始化?
  • @DomenicoPaolicelli 移动构造函数的要点是不必复制临时文件。如果你有SomeBigClass foo = MakeSomeBigClass() 而不必复制那个非常大的类,你可以将它移动到foo。通常这仅适用于在内部使用指针的类,因为移动 POD 类型与复制它相同。
  • 另一个很好的例子是std::vector。如果它有 1000 个元素,则必须复制所有 1000 个元素。移动只是交换内部指针,所以速度要快得多。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 2017-06-11
  • 2023-03-28
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多