引用如何不需要存储?

时间:2013-02-10 16:11:40

标签: c++ variables compiler-construction reference

来自this question,因此来自标准(ISO C ++ - 03):

  

未指明引用是否需要存储(3.7)。

在该线程的一些答案中,据说引用在内部具有相同的指针结构,因此具有相同的大小(32/64位)。

我正在努力掌握的是:参考如何来要求存储?

非常感谢任何举例的示例代码。

修改: 来自@ JohannesSchaub-litb评论,有什么类似的,如果我没有使用const &,或者如果我使用默认值const &,它需要分配吗?在某种程度上,在我看来,根本不应该对引用进行分配 - 当然,除非涉及明确的分配,例如:

A& new_reference(*(new A())); // Only A() instance would be allocated,
                              // not the new_reference itself

有这样的情况吗?

2 个答案:

答案 0 :(得分:5)

采取简单的措施:

int foo() {
  int  x = 5;
  int& r = x;
  r = 10;
  return x;
}

实现可能在幕后使用指向x的指针来实现该引用,但没有理由这样做。它也可以将代码转换为等效形式:

int foo() {
  int x = 10
  return x;
}

然后不需要任何指针。编译器可以将其直接烘焙到rx相同的可执行文件中,而无需存储和取消引用指向x的指针。

关键是,引用是否需要任何存储是一个您不需要关心的实现细节。

答案 1 :(得分:0)

我认为理解的关键是引用类型是不是对象类型。

  

对象类型是(可能是cv限定的)类型,它不是函数类型,不是引用类型,而不是   void type (§3.9[basic.types]/8)

对象需要存储(“对象是存储区域。” - §1.8[intro.object] / 1)

此外,C ++程序对对象进行操作:“C ++程序中的构造创建,销毁,引用,访问和操作对象。” - 同一段

因此,当编译器遇到程序中的引用时,编译器是否必须合成对象(通常是指针类型),因此,使用一些存储,或找到一些其他方法来实现对象模型(可能不涉及存储)的所需语义。