移动构造剖析

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,但是使用的右值引用(再一次避免了拷贝构造函数的调用,忘记了就看上一篇博客:右值引用)。

通过右值引用和移动构造就把上图两次拷贝构造全部砍掉了!效率飞升!


移动构造/赋值
拷贝构造/赋值
要么全有要么全都没有,否则报错

以上是关于移动构造剖析的主要内容,如果未能解决你的问题,请参考以下文章

c#开发移动APP-Xamarin入门剖析

c#开发移动APP-Xamarin入门剖析

无法解析片段中的 ViewModelProvider 构造?

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段

Java反射之剖析方法