移动构造剖析
Posted 阿龙亡命天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动构造剖析相关的知识,希望对你有一定的参考价值。
本质特定意义:(使用场景下的浅拷贝)
取名为移动构造,解决的效率问题
深拷贝:
using namespace std;
calss HasPtrMem
public:
HasPtrMem():_d(new int[10000])
cout << "HasPtrMem()" << this <<endl;
HasPtrMem(const HasPtrMem& another):_d(new int(*another._d))
cout << "HasPtrMem(const HasPtrMem& another)" << this << "->" &another << endl;
~HasPtrmem()
delete _d;
cout << "~HasPtrMem()" << this << endl;
public:
int* _d;
;
HasPtrMem getTemp()
return HasPtrMem();//返回临时对象
目标:中间变量objTemp可以不用申请内存,而直接使用原来的内存。(有点像浅拷贝,但是要特殊处理,这样,效率就很高)
将拷贝构造函数、析构函数改进:
移动构造:
//以上代码加上:
//移动构造函数:
HasPtrMem(HasPtrMem&& another)
cout << "HasPtrMem(HasPtrMem&& another)" << this << "->" << another << endl;
_d = another._d;
another._d = nullptr;
HasPtrMem getTemp()
return HasPtrMem();
拿这行代码举例子,调用getTemp(),发现返回是个临时对象,调用移动过构造函数没有重复申请空间,而是直接接管HasPtrMem()这个临时对象的空间(此处避免了一次拷贝构造函数的调用),紧接着初始化给ra,但是使用的右值引用(再一次避免了拷贝构造函数的调用,忘记了就看上一篇博客:右值引用)。
通过右值引用和移动构造就把上图两次拷贝构造全部砍掉了!效率飞升!
移动构造/赋值
拷贝构造/赋值
要么全有要么全都没有,否则报错
以上是关于移动构造剖析的主要内容,如果未能解决你的问题,请参考以下文章
无法解析片段中的 ViewModelProvider 构造?
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段
Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段