请考虑以下代码,它const以"嵌套"方式将临时对象绑定到引用:
#include <iostream>
std::string foo()
{
return "abc";
}
std::string goo()
{
const std::string & a = foo();
return a;
}
int main()
{
// Is a temporary allocated on the heap to support this, even for a moment?
const std::string & b = goo();
}
Run Code Online (Sandbox Code Playgroud)
我一直试图理解编译器在内存存储方面必须做些什么才能支持这种"嵌套"结构.
我怀疑对于调用foo(),内存分配很简单:std::string当函数foo()退出时,将在堆栈上分配a的存储.
但是,编译器必须做什么来支持所引用的对象的存储b?函数的堆栈goo必须展开并"替换为" b引用的堆栈上的对象,但是为了展开堆栈goo,编译器是否需要在堆上暂时创建对象的副本(在复制之前)它回到不同位置的堆栈)?
或者编译器是否可以完成此构造的要求而不在堆上分配任何存储,即使是暂时的?
或者是它甚至可以将编译器使用相同的存储位置,以由所引用的对象b作为对象由称为a,而不做任何堆栈或在堆上的任何附加配置?
我认为有你没有考虑到,这是因为你没有约束力的中间一步b来a,而是到的副本a.这不是因为任何奇特的记忆恶作剧!
goo按值返回,因此,该值在所有常用机制内的full-expression范围内可用main.它要么在main堆栈框架中,要么在其他地方,或者(在这个设计的情况下)可能完全优化.
这里唯一的魔力就是它被保留在main范围b之内,直到超出范围,因为它b是一个ref-to- const(而不是接近立即销毁).
那么,堆会以任何方式进入它吗?好吧,如果你有一堆,没有.如果你的意思是免费商店,那么,仍然没有.
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |