引用是否在c ++中被视为指针?
int &x = y;
x在内存中是否有空格?
答案 0 :(得分:5)
依赖于实现且未由标准指定。编译器可以将int &x
视为指针,并在堆栈上为其腾出空间;它可能会挂在CPU寄存器中(因此不需要堆栈空间);它可能会意识到它是现有对象的不同名称,只是在运行时将它们混为一谈。
以下是一些情况,作为编译器如何使用引用执行不同操作的示例,具体取决于它的使用方式。
在以下功能中:
int foo( int x )
{
int &y = x;
y += 2;
return y + x;
}
像MSVC这样的编译器只会将y视为x的别名 - 同一变量的不同名称 - 并在编译期间悄悄地用 x 替换 y 的所有提及。因此,该函数实际上将被编译为好像它是
int foo( int x )
{
x += 2;
return x + x;
}
但是,如果您使用引用作为参数
int foo( int &x )
{
x += 2;
return x;
}
然后 x 在内部实现为指针和passed into the function on the stack like any other parameter。编译器将其视为:
int foo( int *x )
{
(*x) += 2;
return *x;
}
关键是你问题的答案不仅取决于你使用的是哪种编译器,还取决于你所编写的特定代码。它没有以任何方式指定。
答案 1 :(得分:2)
将引用实现为引擎盖下的指针是很常见的。 Itanium C ++ ABI指定参数的指针:
3.1.2参考参数
通过将指针传递给实际参数来处理参考参数。
是的,引用使用了一些内存。如果它的实现实际上是一个指针,那么它将是指针大小。如何实现引用是实现定义的。
修改强>
正如Jesse Good从标准中引用的那样,参考是否需要存储是未指定的。
答案 2 :(得分:1)
传递引用作为函数参数可能通过传递指针来工作。声明对同一范围内的现有变量的引用(如示例中所示)可能只是使两个名称引用内存中的相同位置。但这是依赖于实现的;不同的编译器可能会采用不同的方式。