c++ - 引用是否被视为 C++ 中的指针

标签 c++ pointers reference

引用是否被视为 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 在内部实现为一个指针并且 passed into the function on the stack like any other parameter .编译器将其视为:

int foo( int *x )
{
   (*x) += 2; 
   return *x;
}

要点是,您问题的答案不仅取决于您使用的编译器,还取决于您编写的特定代码。标准没有以任何方式指定。

关于c++ - 引用是否被视为 C++ 中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10326831/

相关文章:

c++ - 在 C++ 中返回 char * 数组

c++ - Windows:从语言环境字符串获取 LCID?

c# - 将引用存储在另一个变量中

传递给 const 引用的 C++ 文字会导致自动构造

c++ - enable_shared_from_this - 空的内部弱指针?

delphi - 如何在Delphi中为指向数组的指针保留内存?

c++ - 迭代器两个**的含义

c - 我需要在符号前放什么?

c++ - 铸件内的符号

c++ - 无法使用 assimp 库