4

C++ 标准允许将 const 引用绑定到右值,从而延长临时的生命周期,直到引用超出范围。但是,我无法弄清楚它实际上是如何编译的,让我用一个例子来解释一下:

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()在汇编域中调用 to 后延长字符串的生命周期?

4

1 回答 1

7

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

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

于 2014-12-04T14:56:48.713 回答