当const引用绑定到临时引用时,堆栈中会发生什么?

时间:2014-12-04 14:51:56

标签: c++ stack const-reference

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()之后,如何延长字符串的生命周期?

1 个答案:

答案 0 :(得分:7)

临时返回值将在main的堆栈框架中构建,通过复制/移动foo的临时值,或者更可能使用RVO来删除副本并构造它直接在来电者的框架内。

一旦绑定到引用,临时将与引用一样长。实际上,临时管理的方式与具有相同范围的命名变量完全相同。