努力学习lvalues
,rvalues
并为他们分配内存.因此,有很多学习材料会有一些混乱.
An rvalue
是一个值,只需要在创建它的表达式的边界中存在(至少在C++ 11之前).所以它有一个占据的地址和内存块.但根据定义,我们无法得到一个地址rvalue
,因为它与一个临时对象形成鲜明对比lvalue
.但即使在C++ 11之前,我们也可以rvalue
通过从函数返回它并将其保存为const引用类型来获取地址(呃,我猜不是地址而是值).
那么,更确切地说,rvalue
分配如何运作?程序或操作系统在多长时间内真正记住了rvalue
创建并标记为已分配的内存位置,而另一个对象无法取代它?
我如何看待,现在rvalues
存储就像lvalues
我们只是有其他权限来访问它们.并且它们具有其他类型的释放 - 用于lvalues
超出范围,rvalues
可以通过存在于表达式边界中或者直到没有更多链接来优化.
简短回答:它依赖于实现.
这背后的主要原因是编译器始终可以自由地提高代码的性能.理解这一点的一个更具体的方法是记住,一个值可以存储在CPU的寄存器中,而不是实际存在于您的内存中,这或多或少意味着该值没有地址.我不会打赌我所拥有的一切,但这可能是"我们无法得到一个rvalue的地址"的主要原因之一.
在更一般的方式中,因为rvalue在语义上是临时的,所以更可能被放置在临时位置或者以不能容易地映射到地址的方式进行优化,并且即使它可以在性能方面反作用.
从概念上讲,rvalues生活在"堆栈"上.如果你到达他们的地址,它在概念上是堆栈中的某个地址.如果根本不采用该地址,只要编译器设置正确的指令使其看起来好像是创建的那样,该实体就永远不会真正存在.
即使真正创建实体的位置取决于各种各样的东西,它甚至可能最终都不在堆栈中:它可能位于当前堆栈帧中,但它也可能是其他堆栈帧或某些目标如果rvalue最终被复制/移动到那里并且编译器执行copy-elision.如果rvalue最终被绑定到const&
它,它也可能位于其他地方,如果它没有.
rvalue的生命周期受语言规则的约束.实际实现的方式在很大程度上取决于编译器和/或它所遵循的ABI.