C++ 专题 右值引用、移动语义与完美转发

ysysys

这三个概念都是c++11引入的概念,在此总结一些粗浅的理解。

右值与左值

  • 右值是什么(左值)
    应该在c++98就有左右值的概念吧(不确定我也懒得调研啊)。
    所谓左值右值,左值取址(地址),右值取值(数值)
    Lvalue = expressions of which we can get memory address
    Rvalues = expressions of which we can't get memory address
    左值refer to 内存中的某一具名对象,比如变量、函数参数、类对象
    右值主要是临时对象,比如literals(字面值)、操作的临时结果(a+b), 函数非引用返回的临时对象,匿名对象...
  • 为什么要有右值
    以下内容来自某乎某高赞答案,为防止失效,除了链接直接把原文也抄了过来

可是实现上为了即便是右值表达式为了求出其值依然需要分配一块内存来存放这个值,这形成了一个临时对象,即使之后没有给这个对象取名,对象依然形成了,依然经历了构造和析构的完整生命周期。
这是C++支持RAII之后的事情了。而且即便现在基本类型的右值表达式并不需要事先分配内存。
左右并非是C/C++才开始有的,而是当前计算机体系结构的客观现实。本来,左值是内存上的变量(有地址),右值是只在寄存器当中存在的值(没有地址)。
这样就好理解了吧。只不过有了结构体和对象概念之后,单个数据类型也可能大到无法完整存放在寄存器当中,需要在栈或者堆(反正都是内存)上开额外空间临时存放。再加上RAII的要求,所以才把事情搞那么绕,那么复杂。
其实若把这个临时空间(scratch memory)看作寄存器的扩展,不属于常规内存,那么就好理解了。事实上C++从语法规定上禁止对右值取地址,即便它在内存上有位置。这就是告诉你,这片内存并不是通常的内存,逻辑上它只是超大寄存器。
https://www.zhihu.com/questio...

右值引用(与左值引用)

ok,右值可以理解,那右值引用是什么鬼?为什么要refer一块在内存上但是没法取地址访问的东西。
c++98中的引用很常见了,就是给变量取了个别名,我们可以通过解引用获取到变量(对象),实际上这具体指的是左值引用

阅读 299
7 声望
0 粉丝
0 条评论
你知道吗?

7 声望
0 粉丝
宣传栏