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

Sam*_*Lou 4 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;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,使用x86架构作为例子,首先foo()调用函数并在堆栈中构造字符串对象,这意味着从rsp寄存器中减去所需的空间量(假设为64)位结构); 之后,rsp寄存器返回其原始值,释放函数foo()正在填充的堆栈空间,如果我理解正确,调用bar()将使用该堆栈空间来构造VeryBigObject,这将覆盖该字符串.

考虑到所有这些,在调用foo()汇编域后,如何延长字符串的生命周期?

Mik*_*our 7

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

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

  • @gdasamu:没有RVO,在`foo`的框架中创建一个临时,然后复制/移动以在`main`的框架中创建第二个以形成函数调用结果.使用RVO,只需在`main`中创建一个.在任何一种情况下,引用都绑定到`main`中的引用. (2认同)