可能是重复问题:
什么是右值引用和左值引用之间的区别?(CodeGen)
我想知道,有没有人能够从技术角度解释一下R-Value引用是什么?我的意思是:当创建R-Value引用时,在汇编级别会发生什么。
为了进行内部测试以查看发生了什么,我编写了以下代码:
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
我知道为 'c' 创建一个 R-Value 引用没有意义,但是出于测试的目的我还是这样做了,看看会发生什么。结果如下:
unsigned char c = 255;
mov byte ptr [c],0FFh
unsigned char &c2 = c;
lea eax,[c]
mov dword ptr [c2],eax
unsigned char &&c3 = std::move(c);
lea eax,[c]
push eax
call std::move<unsigned char &> (0ED1235h)
add esp,4
mov dword ptr [c3],eax
我并不是汇编专家,但在这种情况下,'c3' 看起来是对 'c' 的常规引用。
如果我直接将 R-Value 引用绑定到临时变量(char &&c3 = 255),汇编代码的最后一位会发生以下变化:
unsigned char &&c3 = 255;
mov byte ptr [ebp-29h],0FFh
lea eax,[ebp-29h]
mov dword ptr [c3],eax
从这个改变的外观来看,我认为c3仍然实际上是对某个内存位置的引用,该位置保存着值255。因此,它是一个常规的引用-值没有被复制/分配给c3。这是真的吗?
有人能否说出我的假设是否正确,或者我完全错了?直到现在,我总是认为R-Value引用与函数/方法签名(可能是移动构造函数)匹配,当涉及调用解析时,程序员知道如何处理提供的数据(对于移动构造函数,这将是移动数据而不是复制它)。
为了捍卫我刚才提出的相当愚蠢的尝试:我并不打算在汇编级别上搞乱我的代码,我只想理解R-Value引用相对于所有这些年来已经存在的其他引用所引入的技术差异。
任何见解和解释都非常欢迎!
谢谢!
c3
是一个左值引用,而不是右值。 - avakar