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

What happens in the stack when a const reference is bound to a temporary?

本文关键字:引用 什么 堆栈 绑定 常量      更新时间:2023-10-16

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

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

临时返回值将在main的堆栈帧中构造,方法是从foo的堆栈帧复制/移动临时值,或者更有可能使用 RVO 来省略副本并直接在调用方的帧中构造它。

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