1

当我声明一个变量时,它将被分配到堆栈中某个内存索引处,对吗?

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

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

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

编译器做所有的工作?

我希望清楚......如果有人有一些手册或东西,我会很高兴!

谢谢大家,如果我用不好的英语写了对不起!

4

3 回答 3

1

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

于 2015-02-12T19:38:15.830 回答
1

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

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

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

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

于 2015-02-12T19:49:10.063 回答
0

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

未指定引用是否需要存储

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

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

于 2015-02-12T20:41:48.643 回答