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 后延长字符串的生命周期?