引用是否在c ++中被视为指针

时间:2012-04-26 03:29:18

标签: c++ pointers reference

引用是否在c ++中被视为指针?

int &x = y;

x在内存中是否有空格?

3 个答案:

答案 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)

传递引用作为函数参数可能通过传递指针来工作。声明对同一范围内的现有变量的引用(如示例中所示)可能只是使两个名称引用内存中的相同位置。但这是依赖于实现的;不同的编译器可能会采用不同的方式。