引用如何内部存储在c ++中?

how*_*rks 12 c++ pointers reference

我只是想知道,如何在内部存储引用?我觉得深层次的理解会让我更好地理解概念指针与参考,并做出决策选择.

我怀疑它基本上与指针一样,但编译器负责处理指针.请指教.

Ker*_* SB 15

不要求以任何方式"存储"引用.就语言而言,引用只是某个现有对象的别名,而这正是任何编译器必须提供的.

如果引用只是已经在范围内的其他对象的简写,或者带有引用参数的函数被内联,则完全有可能根本不需要存储任何内容.

在需要显示引用的情况下(例如,在不同的转换单元中调用函数时),您实际上可以实现a T & x作为a T * const并将每次出现x视为隐式解除引用该指针.即使在一个较高的水平,你能想到的T & x = y;T * const p = &y;(以及相应的x*p)本质上是相等的,所以这将是实现引用一个明显的方式.

但是当然没有要求,任何实现都可以随意做任何事情.


Alo*_*ave 11

引用只是内部的别名,编译器将它们视为指针.

但是从使用角度来看,用户存在一些细微差别.

一些主要的区别是:

  • 指针可以NULL在引用时无效NULL.没有任何称为引用.
  • const参考临时结合的寿命延伸到它.没有与指针等效的东西.

另外,引用与const指针有一些共同点(不是指向const的指针):

  • 必须在创建时初始化引用.
  • 引用永久绑定到单个存储位置,以后不能反弹.

当你知道你有一些东西(一个对象)要引用,你永远不想引用任何其他东西时使用引用,否则使用指针.

  • @SigTerm如果你仔细瞄准,你可以用脚射击自己. (5认同)
  • @SigTerm我没有什么可以证明的,只需去阅读标准.问题出现在`*((int*)0)`:你正在取消引用一个空指针.你很幸运,它不会马上崩溃.如果_doesn't_崩溃,那么是的,你总是可以将它绑定到引用,但这并没有改变首先取消引用指针的事实是UB. (4认同)
  • @SigTerm无论如何,这是未定义的行为. (2认同)
  • @SigTerm我不认为我实际上不得不引用这个显而易见的标准. (2认同)
  • @SigTerm:请停止争论一个不存在的愚蠢问题.你添加了一个基本上不正确的论点,并且没有用户告诉你为什么它不正确的原因,如果你想仍然反对它的有效性你应该想出一个从标准中反驳证明你的观点,如果不是你应该接受错误从中学习并继续前进,IMO应该是在这里的全部目的,在试图帮助他人的同时学习和提高自己.只是为了这个争论论证是没用的.请长大,或者如果你已经长大,请改变态度. (2认同)