当我声明一个变量时,它会在某个内存索引的堆栈中分配吗?
但是当我声明一个引用变量时,它将指向另一个的相同索引,因此不必在堆栈中分配新的空间...
c ++如何处理这种情况?
我的意思是,它有一个包含名称和索引之间关联的表?
编译器完成所有工作?
我希望能够清楚......如果有人手册或其中的内容我会非常高兴的!
感谢所有人,如果我用糟糕的英语写作,我很抱歉!
答案 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;
导致完全相同的情况。
当函数通过引用接受参数时:如果编译器无法优化函数调用,那么很可能会传递一个地址。