Move语义
- copy数据量大的对象很昂贵.
- 解决问题的方法有两种: shallow copy或者deep copy
- shallow copy可以用类似
v = w
,让v/w共享数据. 但是shallow copy需要程序员额外的维护共享数据的reference counter,才能让资源得到合理的释放.
- deep copy则需要提供一种类似
copy(v, w)
的接口来完成,这时候v/w有各自的数据.
- 讲道理,这个故事就应该完了,但是c++发现了可以优化的点.
- 比如,一个局部变量作为函数返回值, 按道理洗需要deep copy的,但是我们发现其实把该局部变量的数据直接就transfer给target object就更加的高效了.
- 需要说明的是,这仍然是一种deep copy.
move构造函数
class vector {
vector(vector&& v) : my_size(v.my_size), data(v.data) {
v.data = 0; v.my_size = 0;
}
}
- move ctor从source 偷取data, source 变成了空的对象.
- 被当做rvalue传递给函数的变量理论上来说在函数调用结束的时候就应该销毁的. 也就是说该变量状态应该清零.
- 当有指针的时候尤其要注意,不能是一个随机的地址,否则在dtor的时候会出出错.
- 有的时候明明是一个lvalue,但是这个对象就要过期了,想把资源transfer出去,怎么借用move ctor呢? 答案就是std::move()
move赋值构造函数
- move 赋值构造常用swap机制来实现,也就是说把source和target的东西呼唤,当source对象析构的时候实际销毁的是当前对象的东西(貌似也没什么用)
- 为什么这里选择交换而不是初始化呢?其实是一样的把....只不过更加精简的实现
class vector {
vector& operator=(vector&& src) {
assert(my_size == 0 || my_siz == src.my_size);
std::swap(data, src.data);
return *this;
}
};
- 但是实际的时候有一种叫做copy ellsion的方法,编译器会自动优化掉函数传递变量的问题.
move语义什么时候用呢?
- 有了std::move,那么move语义跟unique_ptr有什么差别呢? 好像都是让资源只有一份copy.
- 另一种场景是说std::move之后的src对象就过期了.
- ????? 没解释清楚