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()汇编域后,如何延长字符串的生命周期?
临时返回值将在堆栈帧中构造main,或者通过复制/移动临时值,foo或者更可能的是,使用RVO来删除副本并直接在调用者的帧中构造它.
一旦绑定到引用,临时将与引用一样长.实际上,临时管理的方式与具有相同范围的命名变量完全相同.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |