引用是否认为是 c++ 中的指针?
int &x = y;
x 在内存中有空间吗?
依赖于实现而不由标准指定。编译器可能把int &x
它当作一个指针,并在堆栈上为它腾出空间;它可能会挂在 CPU 寄存器中(因此不需要堆栈空间);它可能会意识到它是现有对象的不同名称,并在运行时将两者混为一谈。
这里有几种情况作为示例,说明编译器如何根据引用的使用方式来做不同的事情。
在如下函数中:
int foo( int x )
{
int &y = x;
y += 2;
return y + x;
}
像 MSVC 这样的编译器会简单地将 y 视为 x 的别名——同一变量的不同名称——并在编译期间悄悄地将所有提及的y替换为x 。因此,该函数实际上将被编译,就好像它是
int foo( int x )
{
x += 2;
return x + x;
}
但是,如果您使用引用作为参数
int foo( int &x )
{
x += 2;
return x;
}
然后x在内部实现为指针,并像任何其他参数一样传递到堆栈上的函数中。编译器将其视为:
int foo( int *x )
{
(*x) += 2;
return *x;
}
关键是您问题的答案不仅取决于您使用的编译器,还取决于您正在编写的特定代码。标准没有以任何方式指定它。
将引用实现为引擎盖下的指针是很常见的。Itanium C++ ABI 为参数指定指针:
3.1.2 参考参数
引用参数通过传递指向实际参数的指针来处理。
是的,引用使用了一些内存。如果它的实现实际上是一个指针,那么它将是指针大小的。如何实现引用是实现定义的。
编辑
正如 Jesse Good 从标准中引用的那样,未指定参考是否需要存储。
将引用作为函数参数传递可能通过传递指针来工作。像在您的示例中一样,声明对同一范围内现有变量的引用可能只会使两个名称都引用内存中的同一位置。但这取决于实现;不同的编译器可能会做不同的事情。