C ++标准允许将const引用绑定到rvalues,从而延长临时的生命周期,直到引用超出范围。但是,我无法弄清楚这是如何实际编译的,让我用一个例子来解释:
std::string foo() {
return std::string("foo");
}
void bar() {
VeryBigObject obj;
// Perhaps do something with the big object
}
int main(int, char **) {
const std::string &foo_str = foo();
bar();
return 0;
}
据我所知,以x86架构为例,发生的事情是首先调用函数foo()
并在堆栈中构造字符串对象,这意味着所需的空间量从rsp
寄存器中减去(假设为64位架构);之后,rsp
寄存器返回其原始值,释放函数foo()
正在填充的堆栈空间,如果我理解正确,对bar()
的调用将使用该堆栈用于构造VeryBigObject
的空格,它将覆盖该字符串。
考虑到所有这些,在汇编域中调用foo()
之后,如何延长字符串的生命周期?
答案 0 :(得分:7)
临时返回值将在main
的堆栈框架中构建,通过复制/移动foo
的临时值,或者更可能使用RVO来删除副本并构造它直接在来电者的框架内。
一旦绑定到引用,临时将与引用一样长。实际上,临时管理的方式与具有相同范围的命名变量完全相同。