首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当常量引用被绑定到临时对象时,堆栈中会发生什么?

当常量引用被绑定到临时对象时,堆栈中会发生什么?
EN

Stack Overflow用户
提问于 2014-12-04 22:51:56
回答 1查看 240关注 0票数 4

C++标准允许将常量引用绑定到右值,因此延长了临时引用的生命周期,直到引用超出作用域。然而,我不知道这实际上是如何编译的,让我用一个例子来解释一下:

代码语言:javascript
运行
复制
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()之后,如何延长字符串的生命周期呢?

EN

Stack Overflow用户

发布于 2014-12-04 22:56:49

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

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

票数 7
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27296981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档