在C++中,rvalue存储在哪里?

11

最近我在学习C++11的新特性。但是,关于右值我有一个问题没有完全理解。

考虑以下代码:

string getText ()
{
    return "Fabricati diem";
}

string newText = getText();

调用 getText() 创建了一个r-value,该值被复制到 newText 变量中。但是这个r-value究竟存储在哪里?复制后会发生什么?

调用 getText()会创建一个右值(r-value),该右值将被复制到newText变量中。但是这个右值并没有固定的存储位置,它可能存在于寄存器中、堆上或栈上。在复制后,原始的r-value通常会被销毁。


1
实际上,这并不是由于返回值优化而被复制的。 - Cory Kramer
7
@Cyber 它无法被移动 进行 RVO。它只能选择其中一种,很可能是后者。 - juanchopanza
很好,你说得对。我编辑了我的评论。 - Cory Kramer
1
栈难道不是答案吗? - ha9u63a7
3
表达式可以是右值表达式或左值表达式。 值本身不是右值或左值。 是的,这个术语有点误导。 - Cheers and hth. - Alf
答案取决于编译目标。标准没有指定。如果该函数无法进行RVO优化,则该字符串可能会存储在.rdata/.rodata中(因此,在技术上,它位于堆上)。 - tux3
1个回答

13

调用getText()创建了一个r-value,该值被复制到newText变量中。

这可能会创建一个临时变量;但这是复制省略允许的一种情况,因此更有可能直接通过函数返回初始化newText,而没有临时变量。

但是这个rvalue确切地存储在哪里?

临时变量存储在何处取决于编译器;标准仅指定其生命周期。通常,它将像自动变量一样被处理,存储在寄存器或函数的堆栈帧中。

复制后它会发生什么?

临时变量的生命周期延伸到创建它的完整表达式的结尾(除非它用于初始化引用,在这种情况下它的生命周期与该引用一样长)。因此,在这里,使用它来初始化newText后立即销毁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接