1.背景最近在看C++右值引用和移动构造函数。感觉这个东西一时半会还是挺难理解的,可能是我没有踩过这个坑,所以没有这么深刻的理解。无论如何,我将尝试在本文中谈论它。二、右值引用1、解决什么问题?在其他编程语言中,很少听到右值引用这个术语。个人感觉还是C++的语言基因决定的,值类型优先。我们都知道,值类型在作为方法参数或返回值时会自行生成。如果值类型很大,来回生成几个深度复制的临时对象会产生巨大的性能开销。总结一句话:右值引用就是尽可能减少中间临时对象的个数,尤其是与堆关联的对象,仅此而已。2.右值引用是什么样的?说到右值引用,首先要说什么是右值、左值,左值一般是有内存地址的变量,而右值一般是立即数或者运行时的临时对象。这种对象是不是会有地址值,是不是很绕口,我举个例子。intmain(){inti=10;整数j=11;intsum=i+j;}10,11,(i+j)是右值,因为它们没有内存地址,除非它们被放入栈中或堆中。i、j、sum是左值,因为它们是线程栈上地址的标识符。知道了左右值的概念,理解左右值引用就很简单了。既然是引用,那么多个变量必须指向同一个地址。对,修改代码如下:intmain(){inti=10;int&k=我;//左值引用int&&m=10;//rvaluereference}接下来看汇编代码:33:inti=10;00FB182Fmovdwordptr[ebp-0Ch],0Ah34:int&k=i;00FB182Fmovdwordptr[ebp-0Ch],0Ah00FB1836leaeax,[ebp-0Ch]00FB1839movdwordptr[ebp-18h],eax36:int&&m=10;00FB183Cmovdoublewordptr[ebp-30h],0Ah00FB1843leaeax,[ebp-30h]00FB1846movdwordptr[ebp-24h],eax从汇编代码看完全一样,也就是说,在汇编级别,其实是没有右值引用和左值引用的。有了这些基础,让我们看看更复杂的类结构。三、如何减少右值引用创建对象1.简要思路其实仔细想想,减少临时对象的创建无非就是在运行过程中重用一些对象,并不需要每次都使用赋值构造函数进行深度复制,画出如下图。理解这个思路,下面举个例子来说明。2.一个简单的例子。C++最讨厌的就是构造函数太多了,多得数不过来,太尴尬了。这里我会做一个简单的+操作例子。#include
