std:move
概念
左值:可以取地址的,可以出现在=左侧或右侧。
右值:不能取地址,只能出现在=右侧。比如常量、lamda表达式
左值引用:使用&表示
右值引用:使用&&表示
std::move:作用是将一个左值转换成右值引用,从而减少拷贝
std::move使用场景
class Array {
// 深拷贝构造
Array(const Array& temp_array) {
size_ = temp_array.size_;
data_ = new int[size_];
for (int i = 0; i < size_; i ++) {
data_[i] = temp_array.data_[i];
}
}
public:
int *data_;
int size_;
};
该类的拷贝构造函数、赋值运算符重载函数已经通过使用左值引用传参来避免一次多余拷贝了,但是内部实现要深拷贝,还是无法避免内存拷贝。 这时,有人提出一个想法:是不是可以提供一个移动构造函数,把被拷贝者的数据移过来,被拷贝者后边就不要了,这样就可以避免深拷贝
class Array {
public:
......
// 右值引用的拷贝构造函数,通过浅拷贝,就可以转移所有权
Array(Array&& temp_array) {
data_ = temp_array.data_;
size_ = temp_array.size_;
temp_array.data_ = nullptr; //假设temp_array是左值,编译会报错
}
public:
int *data_;
int size_;
};
使用方法:
// 例1:Array用法
int main(){
Array a;
// 左值a,用std::move转化为右值
Array b(std::move(a));
}
注意
- 移动构造函数的参数 必须是一个右值或者将亡值的引用
- std::move本身只做类型转换(将左值转换成右值),真正实现“move”操作的(也是真正提升性能的),是以右值引用为参数的移动构造函数和移动赋值重载函数。即,要提升性能,相应对象还需要实现移动构造函数。
- 移动构造函数和移动赋值重载函数执行结束之后,被拷贝者不能再使用

浙公网安备 33010602011771号