Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 引用如何不需要存储?_C++_Variables_Compiler Construction_Reference - Fatal编程技术网

C++ 引用如何不需要存储?

C++ 引用如何不需要存储?,c++,variables,compiler-construction,reference,C++,Variables,Compiler Construction,Reference,根据标准(ISO C++-03),以及因此根据标准(ISO C++-03): 未指定引用是否需要存储(3.7) 在该线程中的一些答案中,据说引用在内部具有相同的指针结构,因此具有相同的指针大小(32/64位) 我很难理解的是:引用如何不需要存储 任何示例代码都将不胜感激 编辑: 从@johanneschaub litb comment,是否有类似的情况,如果我没有使用常量&,或者如果我使用带有默认值的常量&,它需要分配?在我看来,无论如何,不应该为引用分配资源——当然,当涉及到显式分配时除外,例

根据标准(ISO C++-03),以及因此根据标准(ISO C++-03):

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

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

我很难理解的是:引用如何不需要存储

任何示例代码都将不胜感激

编辑
从@johanneschaub litb comment,是否有类似的情况,如果我没有使用
常量&
,或者如果我使用带有默认值的
常量&
,它需要分配?在我看来,无论如何,不应该为引用分配资源——当然,当涉及到显式分配时除外,例如:

A& new_reference(*(new A())); // Only A() instance would be allocated,
                              // not the new_reference itself
有这样的情况吗?

简单地说:

int foo() {
  int  x = 5;
  int& r = x;
  r = 10;
  return x;
}
实现可能会在幕后使用指向
x
的指针来实现该引用,但没有必要这样做。它还可以将代码转换为以下等效形式:

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


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

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

对象类型是(可能是cv限定的)类型,它不是函数类型,不是引用类型,也不是 无效类型
(§3.9[基本类型]/8)

对象需要存储(“对象是存储区域。”——§1.8[简介对象]/1)

< C++程序对对象进行操作:“C++程序中的构造创建、销毁、引用、访问和操作对象。”——同一段落< /P>
因此,当编译器在程序中遇到一个引用时,它是否必须合成一个对象(通常是指针类型),并因此使用一些存储,或找到其他方法来实现对象模型(可能不涉及存储)方面所需的语义,取决于编译器例如,它们可以由编译器进行优化。或者一个奇怪的架构可能会使用不同的存储方式。在某些情况下,它们根本不需要存储<代码>整数a=0;int&b=a即使存储
b
这也是对内存的浪费。请注意,引用不是对象,不应被视为对象。引用只是一个别名。我相信对于编译器来说,这只是允许同一变量使用不同名称的问题。你知道
*(new a())
会杀死一只小猫,对吗?他引用的规则的规范用法是什么?如果引用需要存储,你能给出一个中断的例子吗?@johanneschaub litb为什么会有这样的例子?它说,他们是否需要存储还没有确定,不是说他们一定不需要存储。使用存储不是实现的可观察行为的一部分,因此不需要有一个规则来允许不使用。没有一个规范性的规则,“不管函数是否需要存储都是未指定的”。即使C++在注释中说函数可以用对象的方式使用存储。在例子中,一个实现也可以不使用<代码> x<代码>的存储。它可以擦除整个
foo
。从@johanneschaub litb comment中,是否有类似的情况,如果我没有使用
常量&
,或者如果我使用带有默认值的
常量&
,它需要分配?从您的示例来看,似乎根本不应该有分配——当然,当您显式分配某些内容时除外。有这样的情况吗?我将把这一点补充到问题中。