尝试学习lvalues
,rvalues
和它们的内存分配。因此,在大量学习资料中,会出现一些困惑。rvalue
是只需要在创建它的表达式的边界中存在的值(至少到C++ 11为止)。因此,它具有一个地址和占用的内存块。但是根据定义,我们无法获得rvalue
的地址,因为与lvalue
相比,它是一个临时对象。
但是即使在C++ 11之前,我们也可以通过从函数返回rvalue
的地址并将其保存为const引用类型(呃,我猜不是地址,而是一个值)来获得rvalue
的地址。
那么,更准确地说,rvalue
分配如何工作?程序或OS真正记得多长时间创建rvalues
并将其标记为已分配的内存位置,而另一个对象却不能代替它?
我的看法是,现在lvalues
的存储方式与lvalues
一样,但是我们只是拥有访问它们的其他权限。并且它们还有其他类型的解除分配-对于rvalues
超出范围,对于ojit_code可以通过表达式边界中的存在或直到没有更多链接来优化。
最佳答案
简短的答案:它取决于实现。
造成这种情况的主要原因是,一如既往的自由让编译器可以提高代码的性能。理解这一点的一种更具体的方法是记住,一个值可以存储在CPU的寄存器中,而从不实际存在于内存中,这或多或少意味着该值没有地址。我不会打赌我拥有的一切,但这可能是“我们无法获得右值的地址”的主要原因之一。
以更一般的方式,由于右值在语义上是临时的,因此它更有可能被放置在临时位置或以无法轻易映射到地址的方式进行优化,即使它可以在性能方面适得其反。