C++ C++;:技术层面(ASM)的R值参考是什么?

C++ C++;:技术层面(ASM)的R值参考是什么?,c++,assembly,rvalue-reference,C++,Assembly,Rvalue Reference,可能重复: 我想知道,有人能解释一下R值参考在技术层面上是什么吗?我的意思是:当创建R值引用时,在汇编程序级别上会发生什么 为了进行一个小测试,看看内部发生了什么,我编写了以下代码: char c = 255; char &c2 = c; char &c3 = std::move(c); 我知道创建一个对“c”的R值引用是没有意义的,但为了测试起见,我还是做了,看看它做了什么。结果如下: unsigned char c = 255; mov byte

可能重复:

我想知道,有人能解释一下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
从这个变化的外观来看,我假设c3实际上仍然是对某个内存位置的引用,该位置保存值255。因此,它是一个常规引用-该值未复制/分配给c3。这是真的吗

有人能说我的假设是正确的还是完全偏离了轨道?直到现在,在调用解析时,我一直认为R值引用与函数/方法签名(可能是移动向量)相匹配,以便编码人员知道如何处理提供的数据(对于移动向量,移动向量将移动数据,而不是复制数据)

为了捍卫我刚才提出的这一相当愚蠢的尝试:我不打算在asm级别上乱动我的代码,我只想了解R值引用与这些年来出现的其他引用相比,引入了哪些技术差异

欢迎提供任何见解和解释

谢谢

当创建R值引用时,在汇编程序级别会发生什么

保留高级语义所需的一切。编译器的具体功能取决于编译器供应商的想法。程序集没有左值、右值或引用的概念,所以停止寻找它们。打开优化,您正在查看的代码可能会更改(或者如果不使用变量,可能会完全停止存在)

我只是想弄清R-Value参考文献与这些年来的其他参考文献在技术上有什么不同


右值引用支持移动语义,而右值引用又支持重要的优化机会。该标准没有说“哦,这些是右值引用,这就是在汇编中实现它们的方式”。实现甚至可能根本不会生成程序集。

在优化之前,引用作为包含绑定对象地址的指针存在


但是编译器非常努力地去优化它。内联尤其可能会导致小函数中引用参数的所有使用都被包含绑定对象值的寄存器的直接使用所取代。

r值引用在asm级别上没有什么不同-它可能与常规引用完全相同(取决于编译器如何看待它)。差异仅存在于C++语言水平上。 r值引用所携带的信息是,被引用的对象是临时的,任何接收到它的人都可以自由修改它。有关对象位置的信息可能会像常规引用一样进行传输(编译器可能会尝试以不同的方式对其进行优化,但这是编译器的内部问题)


r值引用和非常量l值引用之间的区别在于,每个l值将仅自动转换为l值引用(从而防止意外修改),而r值的表达式将转换为两者(r值引用优先),如果不支持移动语义,则允许移动语义和常规调用。STD::除了允许自动将L值转换成R值引用,移动不做任何事情。

< P> R值参考概念可以完全在C++级别上描述,不需要读取汇编代码。你只需要得到一些分配内部资源的最小C++类,并且“偷窃”另一个对象的RValk引用资源是显而易见的。就像这篇经典文章中的remote_integer类:
这个代码的汇编翻译非常简单,但是区别是在C++代码中看到的。对于像char这样的简单类型,它们可以用来演示一些RValk引用语法特性,但是没有使用这种类型的RValk引用的含义——无论是C++还是汇编级别。因此,如果在C++中使用char & & c没有任何优势,则在汇编中没有什么有趣的东西。

在(未优化的)汇编级上,R值是对象的实例,就像L值、引用或“值”。R值只是告诉编译器哪些函数用于复制/构造。这类似于对象或参数中的引用实际上只是程序集级别的指针,但编译器的处理方式有所不同。请注意,
c3
是l值引用,而不是r值。“技术”。你一直用那个词。我不认为它的意思和你想的一样。@Mooning:你所说的“对象实例”到底是什么意思?以前从未听说过“对象”这个词的用法。从技术上讲,引用是实体。@FredOverflow:从技术上讲是正确的。我一直在避免说“…是一个对象”,因为它在口语上似乎不清楚,但事后看来似乎很好。
unsigned char &&c3 = 255;
    mov         byte ptr [ebp-29h],0FFh  
    lea         eax,[ebp-29h]  
    mov         dword ptr [c3],eax