【问题标题】:How is a reference variable represented in memory?引用变量如何在内存中表示?
【发布时间】:2016-04-07 22:27:07
【问题描述】:
int num = 0;
int *ptrNum = #
int &refNum = num;

内存表1或表2中引用变量的正确表示是哪一个?
如果表 2,那么为什么指针是对象而引用不是?
如果两种表示都不正确,请提供正确的表示并解释为什么引用不是对象。

【问题讨论】:

  • 引用变量的存储方式未指定。
  • 我认为这是一个很好的、写得很好的问题。 OP 不知道更好是不重要的。
  • 上述代码的问题在于“Table 3: /nothing/”也是一个有效的现实结果!使用refNum 经常会影响其表示,所以问题不完整。

标签: c++ pointers c++11 reference


【解决方案1】:

内存表1或表2中引用变量的正确表示是哪一个?

可能是,也可能不是。

在这种情况下,不需要存储对象的地址,所以表1就足够了。在另一个示例中,可能需要引用变量的地址。例如当引用是非内联函数的参数时。

请提供正确的表述

C++ 标准草案 N4140 [dcl.ref]/4:

未指定引用是否需要存储

如何存储根本没有指定。

解释为什么引用不是对象。

同一文档将对象定义为

[intro.object]/1

...一个对象是一个存储区域...

如果一个引用没有被定义为有存储,那么它就没有被定义为一个对象。

【讨论】:

  • 我不认为“将引用传递给非内联函数”的情况也要求使用表示 2。编译器必须知道x1 或至少知道如何计算它,才能将其存储在x2 中。但是如果它知道这一点,它也可以在将x1 直接推入调用堆栈时使用这个知识。
  • @MSalters 我也不这么认为。正如我所说,在那种情况下(为了清楚起见,我修改了措辞)将需要引用变量的地址(如您所说,存储在 调用堆栈上)。如果地址已经存储在 OP 示例中的某个位置,则假设允许编译器重用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2013-07-10
相关资源
最近更新 更多