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()并在堆栈中构造string对象,这意味着从rsp寄存器中减去所需的空间量(假设为64位体系结构);然后,rsp寄存器返回到其原始值,释放函数foo()正在填充的堆栈空间,如果我理解正确的话,对bar()的调用将使用该堆栈空间构造VeryBigObject,这将覆盖字符串。
考虑到所有这些,在调用程序集域中的foo()之后,如何延长字符串的生命周期呢?
发布于 2014-12-04 22:56:49
临时返回值将在main的栈帧中构造,方法是从foo的栈帧中复制/移动一个临时值,或者更有可能的是,使用RVO来省略副本并直接在调用者的帧中构造它。
一旦绑定到引用,临时值将与引用一样长。实际上,临时变量的管理方式与具有相同作用域的命名变量完全相同。
https://stackoverflow.com/questions/27296981
复制相似问题