c++ - 无论如何,当临时对象被销毁时,为什么还需要一个移动构造函数?

标签 c++

为什么只有未命名的对象在完整表达式结束之前还活着,为什么还需要一个移动构造函数? 如果我们有这段代码:

class Example6 {
    string* ptr;
  public:
    Example6 (const string& str) : ptr(new string(str)) {}
    ~Example6 () {delete ptr;}
    // move constructor
    Example6 (Example6&& x) : ptr(x.ptr) {x.ptr=nullptr;}
    // move assignment
    Example6& operator= (Example6&& x) {
      delete ptr; 
      ptr = x.ptr;
      x.ptr=nullptr;
      return *this;
    }
};


int main () {

  Example6 bar = Example6("ple");   // move-construction

  return 0;
}

我们有一个右值引用作为移动构造函数和赋值操作的参数。在这种情况下,bar 的移动构造函数在初始化为同一类的临时对象时被调用。我不明白的是:既然临时对象有完整表达式的生命周期,为什么需要移动构造函数而不是复制构造函数?我的意思是,隐式定义的移动构造函数和赋值运算符从临时中“删除”数据,即使这些数据在分号后都会被销毁,所以为什么你需要一个移动构造函数,它在某种程度上与复制构造函数相同......为什么需要删除来自临时文件的数据无论如何都会在分号后被销毁?

最佳答案

C++ 添加移动构造函数主要是为了帮助提高性能。根本不使用移动构造函数就可以进行适当的资源管理。事实上,在引入移动构造函数之前,C++ 就是这样做的。

复制然后销毁临时对象的问题是被调用的复制构造函数不知道它被赋予了一个临时对象来复制。因此,复制构造函数必须复制数据,就像它的源不是临时的一样,可能会在复制对象的过程中分配额外的资源。

当编译器知道您将要复制临时文件时,它会让您知道您可以根据需要收集尽可能多的内部信息,从而有可能为您节省一些昂贵的分配。

关于c++ - 无论如何,当临时对象被销毁时,为什么还需要一个移动构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44144642/

相关文章:

c++ - 是否可以在对象实例化期间定义 std::array 类成员的元素计数?

c++ - 引用未初始化的内存。未定义的行为?

可从任何序列类型初始化的 C++ 类

c++ - 头文件在一个项目中抛出错误,但在另一个项目中不会

c++ - Dev C++ 上出现了一个奇怪的 sizeof() 错误

c++ - IWebBrowser2 和移动托管窗口

c++ - 统一容器特性

c++ - STL迭代器相等性是如何建立的?

c++ - 如何从字符串创建 web::uri 并将其放入 client.connect() 中?

c++ - ffmpeg编译错误__wrap_swr_convert