C++ 智能指针(1.5):move 语义
C++智能指针(1.5):move语义 move语义 定义 右值引用(Rvalue Referene)是 C++ 11中引入的新特性,它实现了转移语义(Move Sementics)和精确传递(Perfect Forwarding),其主要目的有 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。 能够更简洁明确地定义泛型函数。 实现 move 语义的实现非常简单,它将传入的参数 _Tp&& __t 使用静态类型转换 static_cast<_Up&&>(__t) 转变成了成了对应类型的右值,也就是说使用 move 语义之后,编译器窃取(一般会在移动构造函数和移动赋值操作符里将原有对象指向 nullptr)了原有对象的右值,并延长了这个右值的生命周期并将其用来赋值给其他的对象,而没有对右值做任何拷贝操作。 template <class _Tp> typename remove_reference<_Tp>::type&& move(_Tp&& __t) _NOEXCEPT { typedef typename remove_reference<_Tp>::type _Up; return static_cast<_Up&&>(__t); } 测试 定义一个 Object 类和一个 MoveObject 函数使用 move 语义返回一个 Object 的类对象,可以看到在 MoveObject 函数返回右值后,obj 对象调用了移动构造函数。 class Object { public: Object() { std::cout << "Construct" << std::endl; } Object(const Object &other) { std::cout << "Copy" << std::endl; } Object(Object &&other) noexcept { std::cout << "Move" << std::endl; } ~Object() { std::cout << "Destruct" << std::endl; } void Print() { std::cout << "Print" << std::endl; } }; Object MoveObject() { Object obj; return move(obj); } int main() { Object obj = MoveObject(); return 0; } /* output: Construct Move Destruct Destruct */ 返回值优化(RVO,Return value optimisation) 返回值优化是一种编译器优化技术,允许编译器在调用点(call site)直接构造函数的返回值。 ...