std::move
将一个左值强制转换成右值引用,基本等同static_cast<T&&>lvalue,只是做了类型转换。std::move+移动构造函数或移动复制运算符,才能起到减少不必要拷贝。
右值引用
c++引用右值引用之后,可以通过右值引用,充分使用临时变量,减少不必要的拷贝,提高效率。 右值引用、移动构造函数、移动赋值运算符、std::move的引入,可以充分利用优质资源,减少不必要的拷贝。 如: 1、使用vector::push_back等函数时,会调参数对象的拷贝构造;使用std::move,可以避免不必要的拷贝操作。
移动构造
b=std::move(a) 通过移动构造,b拥有了a的资源,a不再拥有资源。调移动构造之后,访问a的行为是未定义的,比如根据移动构造的语义,可以是空指针,如果资源是std::string被移动后是空字符串。
//移动构造函数的列子
RValue(RValue&& a) {
sources = std::move(a.sources);
cout<<"&& RValue"<<endl;
}
std::move使用场景
使用前提
1、定义的类使用了资源,并且定义了移动构造函数和移动拷贝运算符, 2、该变量即将不再使用
注意事项
1、被const修饰的变量,std::move之后,传参数调构造,还是会调到拷贝构造函数
void put(const RValue c){
cout<<"put----------"<<endl;
unique_ptr<RValue> up(new RValue(std::move(c)));
cout<<"put----------"<<endl;
}
RValue c;
put(std::move(c));
/*输出
put----------
& RValue
put----------*/
参考资料
1、std::move https://zhuanlan.zhihu.com/p/94588204
|