当我声明一个引用变量时,堆栈会发生什么? C ++

时间:2015-02-12 19:35:25

标签: c++ reference stack aliasing

当我声明一个变量时,它会在某个内存索引的堆栈中分配吗?

但是当我声明一个引用变量时,它将指向另一个的相同索引,因此不必在堆栈中分配新的空间...

c ++如何处理这种情况?

我的意思是,它有一个包含名称和索引之间关联的表?

编译器完成所有工作?

我希望能够清楚......如果有人手册或其中的内容我会非常高兴的!

感谢所有人,如果我用糟糕的英语写作,我很抱歉!

3 个答案:

答案 0 :(得分:1)

C ++标准没有指定ABI,所以这是实现定义的。但通常的方法是将引用实现为指针,因此在堆栈上分配指针。但是,如果此引用未在任何地方传递,则可以将其优化掉,并简单地用它指向的变量替换。

答案 1 :(得分:1)

在典型的实现中,变量的分配取决于您如何声明它以及声明它的位置。

通常,在函数外部定义的变量放在一个内存区域(堆栈或堆栈)。常量可以放在不同的区域或可执行文件中。

可以在堆栈上分配函数内定义的非static的变量。它们可以放在寄存器中而不是堆栈中。取决于编译器和优化设置。变量可以“优化掉”而不存在于最终的可执行文件中。

许多编译器都会将引用视为指针。因此,当您通过引用传递变量时,编译器可以通过指针传递。

答案 2 :(得分:0)

C ++ 14 [dcl.ref] / 4说:

  

未指明引用是否需要存储

对于像int a; int &b = a;这样的情况,编译器实际上可能只存储两个标识符,这两个标识符在编译时都在其标识符表中引用相同的地址。这里可能不需要额外的运行时存储空间。实际上,C ++的规则说int b; int &a = b;导致完全相同的情况。

当函数通过引用接受参数时:如果编译器无法优化函数调用,那么很可能会传递一个地址。