📜  C++ 实用程序中的 std::move |移动语义、移动构造函数和移动赋值运算符(1)

📅  最后修改于: 2023-12-03 14:59:48.918000             🧑  作者: Mango

C++ 实用程序中的 std::move |移动语义、移动构造函数和移动赋值运算符

什么是移动语义

移动语义是C++11引入的新语义,它主要解决了C++传递对象时进行深拷贝所带来的性能问题。移动语义的主要思想是:当要传递一个对象时,如果该对象的所有权即将从一个对象转移到另一个对象,那么就需要特殊的语义,这个特殊的语义就是“移动”。

在进行对象的移动时,移动语义将不会发生任何内存拷贝,而是将原对象中的资源(比如:内存、文件句柄等)所有权直接转移给目标对象,可以大大提升程序的运行效率。

移动构造函数和移动赋值运算符

在C++11中,移动语义通过移动构造函数和移动赋值运算符来实现。

移动构造函数

移动构造函数是一个不带const关键字的构造函数,其形参为一个右值引用。它的作用是将右值的所有资源(比如:内存、文件句柄等)转移给新的对象,释放原对象的内存资源。

class unique_ptr
{
public:
    unique_ptr();                           // 默认构造函数
    unique_ptr(unique_ptr&& other);         // 移动构造函数
    unique_ptr& operator=(unique_ptr&& other);  // 移动赋值运算符
    // ...
private:
    T* m_ptr;
};

在以上代码中,unique_ptr类的移动构造函数为unique_ptr(unique_ptr&& other)。

移动赋值运算符

移动赋值运算符是一个带有右值引用参数的赋值运算符,它用来将右值的所有资源转移给目标对象,释放原对象的内存资源。

class unique_ptr
{
public:
    unique_ptr();                                 // 默认构造函数
    unique_ptr(unique_ptr&& other);               // 移动构造函数
    unique_ptr& operator=(unique_ptr&& other);    // 移动赋值运算符
    // ...
private:
    T* m_ptr;
};

在以上代码中,unique_ptr类的移动赋值运算符为unique_ptr& operator=(unique_ptr&& other)。

std::move

std::move是一个标准函数,它用来将一个左值强制转化成右值引用,从而可以进行移动操作。

使用std::move可以使编译器将左值当作右值进行处理,在传递一个对象时,可以避免不必要的深拷贝操作,以提高程序的性能。

unique_ptr<int> p1(new int(42));
unique_ptr<int> p2 = std::move(p1);   // 移动p1指向的对象资源给p2
总结

移动语义是C++11引入的一种新语义,它可以在传递对象时避免不必要的深拷贝操作,从而提高程序的性能。通过移动构造函数和移动赋值运算符,可以将一个对象的资源直接转移给另一个对象。同时,使用std::move可以使编译器将左值当作右值进行处理,以避免不必要的深拷贝操作。