我知道引用不占用任何内存,它将指向它引用的相同内存位置.例如
int i=10;
int &r = a;
Run Code Online (Sandbox Code Playgroud)
假设i指向内存位置1000,因此在这种情况下r也将指向内存位置1000.但是在C++中,当我们声明一个变量时,它将在某个位置存储在内存中.在这种情况下r指向某个位置但它应该存储在内存中的某处作为内部表示仅在引用上使用const指针.提前致谢.
这是未指明的,并且有充分的理由.真正的答案是:它取决于参考.它可以表示为普通指针,或者根本不存在.
如果您有一个具有自动存储持续时间的函数本地引用,例如r:
void foo()
{
int x[4] = {0, 1, 2, 3};
int &r = x[1];
// more code
}
Run Code Online (Sandbox Code Playgroud)
那么它可能根本不会占用任何空间.编译器将简单地将所有用途r视为别名x[1],并int直接访问它.请注意,此类别名样式引用也可以来自函数内联.
另一方面,如果引用是"持久的"或对其他转换单元(例如数据成员或全局变量)可见,则它必须占用一些空间并存储在某处.在这种情况下,它很可能被表示为一个指针,使用它的代码将被编译为取消引用该指针.
从理论上讲,其他选项也是可能的(例如查找表),但我不认为这些选项可供任何真实编译器使用.
我知道引用不占用任何内存
不完全是。一个引用是否有存储,是未指定的。它可能会也可能不会。在此特定示例中,它不需要存储,因此在典型实现中,它不使用任何存储。
它将指向它所引用的相同内存位置
这听起来像是同义反复或仅仅是误解,这取决于您所说的“点”是什么意思。的引用是指物体或绑定到该对象。您可以将其视为变量名称的别名。变量名也不使用任何内存。
在这种情况下 r 指向某个位置,但它应该存储在内存中的某个位置
它不需要存储在内存中。考虑以下代码:
int i=10;
int &r = a;
int j = r * 3;
Run Code Online (Sandbox Code Playgroud)
编译器可以将其解释r * 3为i * 3就像您最初编写的那样。引用对象的位置在编译时是已知的,因此不需要将地址存储在内存中,这是运行时的事情。
但是,在其他情况下,可能需要存储。例如: 考虑具有外部链接的非内联函数的引用参数。在编译函数时无法知道引用的对象,因此必须在运行时在内存中传递一些信息。
作为引用的内部表示,仅使用 const 指针
那不正确。内部表示可能使用一个指针,或者它可能使用其他东西,或者它可能不需要使用任何东西。
所以,简洁地回答
引用变量存储在哪里
它是未指定的。要么无处,要么在某处。