C++11

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对象就过期了.
  • ????? 没解释清楚

你可能感兴趣的:(C++11)