std::move是如何移动对象的

如下代码:因为c++11 push_back()也支持了移动语义,那么为何下面代码打印出来的前后对象的地址不一样呢?而且还多一次构造和析构。

class Stu{

};

int main(){
    vector<Stu> vec;
    Stu stu;
    printf("before:%p\n", &stu);  //before:0x7ffeef9eb9a8
    vec.push_back(std::move(stu));
    printf("after:%p\n", &vec[0]);after:0x7fbc44405830
    return 0;
}
输出:
constructor
before:0x7ffee1f5e9a8
copy constructor
after:0x7f9b214041e0
destructor
destructor
阅读 3.1k
2 个回答

“移动”只是一个特殊的拷贝操作,区别在于对普通拷贝,源对象会保持不变(一般声明为 const);对“移动”,源对象可能改变(不会声明为 const)。

去掉保持源对象不变的限制之后,在某些情况下可以实现更快的拷贝。普通的拷贝一般都是深拷贝,而移动拷贝则可以用浅拷贝实现(然后拷贝之后将源对象置空)。

它也是一种拷贝,所以源对象跟目标对象不是同一个对象(地址不同),也不会节省构造于析构的调用。


std::move 不会执行“移动”的操作,只是用来标记一个对象是可以被移动的。


使用移动语义,得自己定义个 move constuctor / move assign operator 。否则在需要移动的地方还是会用普通拷贝。

在有自定义的拷贝构造函数的时候,不会自动生成移动构造函数。

move 移动的是变量里面的数据,而不是变量本身。类似于把一杯水倒入到另外的一个杯子里面,原来的杯子空了,新的杯子满了,但杯子本身仍然没变。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题