4

这个问题,因此,从标准(ISO C++-03):

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

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

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

任何举例说明这一点的示例代码将不胜感激。

编辑:来自@JohannesSchaub-litb 评论,如果我没有使用 a const &,或者如果我使用的是const &具有默认值的 a ,是否需要分配?在我看来,不知何故,根本不应该对引用进行分配——当然,除非涉及到明确的分配,例如:

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

有没有这样的案例?

4

2 回答 2

5

做一些简单的事情:

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

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

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

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

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

于 2013-02-10T16:14:14.917 回答
0

我相信理解的关键点是引用类型不是对象类型。

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

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

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

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

于 2013-02-10T18:00:02.687 回答