可能重复:
右值引用和左值引用有什么区别?(代码生成)
我想知道,谁能在技术层面上解释一下 R 值参考是什么?我的意思是:当创建 R 值引用时,汇编程序级别会发生什么。
为了进行小测试以了解内部发生的情况,我编写了以下代码:
char c = 255;
char &c2 = c;
char &c3 = std::move(c);
我知道创建对“c”的 R 值引用是没有意义的,但只是为了测试,我还是这样做了,看看它做了什么。结果如下:
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
到目前为止,我还不是 asm 专家,但在我看来,在这种情况下,“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 引用来匹配函数/方法签名(可能是 move-ctor),以便编码人员知道如何处理提供的数据(对于 move-ctor那将是移动数据而不是复制它)。
为了捍卫我刚刚提出的这个相当愚蠢的尝试:我不打算在 asm 级别上搞砸我的代码,我只是想了解这些年来 R-Value 引用与其他引用相比引入了哪些技术差异。
任何见解和解释都非常受欢迎!
谢谢!