如下代码:因为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
“移动”只是一个特殊的拷贝操作,区别在于对普通拷贝,源对象会保持不变(一般声明为 const);对“移动”,源对象可能改变(不会声明为 const)。
去掉保持源对象不变的限制之后,在某些情况下可以实现更快的拷贝。普通的拷贝一般都是深拷贝,而移动拷贝则可以用浅拷贝实现(然后拷贝之后将源对象置空)。
它也是一种拷贝,所以源对象跟目标对象不是同一个对象(地址不同),也不会节省构造于析构的调用。
std::move 不会执行“移动”的操作,只是用来标记一个对象是可以被移动的。
使用移动语义,得自己定义个 move constuctor / move assign operator 。否则在需要移动的地方还是会用普通拷贝。
在有自定义的拷贝构造函数的时候,不会自动生成移动构造函数。