移动语义
先提出一个问题。
现在有一个字符串数组长度有20000个,每个字符串含有100个字符,那么这近20MB的内存空间在进行赋值以及用它复制出一个副本,比如说传参,返回值传递等,每一次这样的操作都会复制开辟20MB的内存空间一个个的复制过去。
尤其是在返回值的时候,函数返回一个超大的空间,但是只用临时变量暂时存储,返回结果复制过去之后就里马删掉了,这样的操作看起来是不必要的,假如接受返回值的变量直接指向那块临时变量该多好,这要就不用来回复制这块内存了。
移动语义解决了这个问题。
要想实现移动语义,就要告诉编译器什么时候该移动,什么时候不移动。所以这个时候就需要额外定义构造函数,而他的参数是右值。注意,因为移动语义改变了原来的值指向内存的指针,所以不能声明参数为const
Useless::Useless(Useless&& f):n(f.n)
{
pointer = f.pointer;
f.pointer = nullptr; //f is not a const value
f.n=0; //others are all set to NULL too
}
移动构造函数大概就是上述的操作,他将原本f对象的数据交给新构造的对象,然后清除自身的关联数据。
赋值重载运算符也可以实现移动语义
如果你没有定义移动构造函数,那么代码会帮你优化,他依然不会创造用来传递返回值的中间变量,而是调用你定义的复制构造函数。
如果你提供了默认、复制或赋值运算符,那么编译器不会自动