【问题标题】:Does the reference consider as pointer in c++引用是否认为是 C++ 中的指针
【发布时间】:2012-05-06 19:07:26
【问题描述】:

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

int &x = y;

x 在内存中有空间吗?

【问题讨论】:

  • 我相信这可能会回答“它有空间吗?”:stackoverflow.com/questions/1179937/… - 基本上,实现已定义 - 它们可以(并且很可能是)用指针实现,并且它们可能不必采取在堆栈上增加空间。

标签: c++ pointers reference


【解决方案1】:

将引用实现为引擎盖下的指针是很常见的。 Itanium C++ ABI 为参数指定指针:

3.1.2 参考参数

通过传递指向实际参数的指针来处理引用参数。

是的,引用会占用一些内存。如果它的实现实际上是一个指针,那么它将是指针大小的。引用的实现方式由实现定义。

编辑

正如 Jesse Good 从标准中引用的那样,未指定参考是否需要存储。

【讨论】:

  • Yes, a reference uses some memory. 来自标准:It is unspecified whether or not a reference requires storage,所以这有点误导。
  • @JesseGood 我会添加它,尽管对于任何临时的也可以这样说……
  • 特别是,C++ ABI 处理函数签名。那是因为每个函数都是由一个编译器编译的,所以你只需要标准化它们之间的接口。函数内部由每个编译器保留,许多可以消除那里的引用。
【解决方案2】:

传递一个引用作为函数参数可能通过传递一个指针来工作。声明对同一范围内现有变量的引用,就像在您的示例中一样,可能只会使两个名称都引用内存中的同一个位置。但这取决于实现;不同的编译器可能会做不同的事情。

【讨论】:

    【解决方案3】:

    依赖于实现而不由标准指定。编译器可能会将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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2021-07-03
      • 2020-04-04
      相关资源
      最近更新 更多