参考变量如何存储在mem中

时间:2014-03-01 16:29:20

标签: c++ reference

两个问题: 1)参考变量如何存储在mem?

int a=1;
int &b=a;
cout<<&a<<endl<<&b;

a和b的地址相同?所以,b作为参考变量在mem中没有空格?!

2)引用变量只能在定义时初始化,但是如果它可以初始化多次?如何编写代码(只是为了告诉表单本身)?

int a=c=1;
int &b=a;
b=c;//i know this will change the source value of a,not re-assign the ref b,so
&b=c;//will this be ok?

5 个答案:

答案 0 :(得分:7)

语言没有指定如何存储引用,但大多数编译器会在内部将它们实现为指针。

无论如何,由于引用对程序员来说是“透明的”,因此当您编写&b时,您实际上是在获取引用的地址,而不是引用的地址。这就是为什么你得到相同的地址。

类似地,写&b=c对引用本身没有任何作用,但是将值c写入指针a(无意义的东西)。它与int* ptr = &b; ptr = c;

相同

请务必将&理解为“地址”,将&理解为引用类型表示法,are two different things

int a;
int* ptr = &a; // <--- taking (and storing) the address of  `a`, i.e. a pointer

int& b = a;    // <--- declares a reference to `a`; `b` now behaves like `a`

// Two entirely different meanings of `&`.

还有&的第三个含义,即按位AND

无论如何,如果你想重新安排参考资料,那你就不走运了。你根本做不到。

答案 1 :(得分:1)

  1. &b为您提供与&a相同的值这一事实并未说明b存储在内存中的位置(如果有的话)。 C ++语言没有为您提供任何确定引用本身地址的方法。根据定义,您的&b评估为&a。如果存在这种表示,它与b在内存中的表示的实际地址完全没有关系。

    引用是否在内存中具有表示是未指定的。实际上,它可能很容易因一个上下文而异:一些引用会占用内存,另一些则不会。在您的特定示例中,编译器很可能不会为b创建任何内存表示。它只会将b视为a的另一个名称。

    但即使编译器决定在内存中为b分配内容,您仍然无法通过分析&b的值来检测到这一事实。 &b的值与此完全无关。

  2. 正如你自己所说的那样,“引用变量只能在定义时初始化”。没有办法“重新定义”现有的参考。没有办法“重新初始化”它。

答案 2 :(得分:1)

  

参考变量如何存储在mem?

根据标准§8.3.2/ 4:

  

未指明引用是否需要存储

因此无法保证引用存储在内存中。


  

引用变量只能在定义时初始化,但是如果可以初始化多次?

请记住&位于:

int& x;

是该类型的一部分。虽然&位于:

&var

是将返回var地址的运算符。

它们是两个完全不同的东西。一个用于声明引用,另一个(通常,因为它可以重载)来获取某个l值的地址。

答案 3 :(得分:0)

我认为这里有一个混乱:

  • 语义:您编写的代码意味着什么,应该做什么
  • 实现:这些语义如何转换为计算机执行的内容,并产生所需的效果

C ++标准规定了引用应该如何表现(并且值得注意的是,您不能让它们引用另一个对象,或者获取它们的地址应该产生与它们引用的对象的地址相同的值)。这与它们在引擎盖下如何实现无关......否则你就没有可移植性。

答案 4 :(得分:0)

C ++标准没有定义引用如何存储在内存中。实际上,也许它们并不总是需要存储,因为编译器可能会优化它们。这取决于您的编译器,编译器选项,操作系统以及程序中代码的上下文。对于这种情况,完全不可能给出一般答案。

相关的是可观察的行为。就这一点而言,引用对象。它出现在不同的名称下,但它是同一个对象。这就是为什么一旦你有了引用,取其地址与取其原始名称下的对象地址相同。使用引用执行的所有操作与使用对象执行的操作相同,包括获取其地址。参考=对象。

正如您所看到的,这与指针有很大不同。 指针是他们自己的对象,可能恰好指向其他对象。您可以获取指针本身的地址,它将与指向对象的地址不同。

对象的引用对象的事实也意味着您以后不能引用引用其他内容。请记住,这只是一种以不同名称访问同一个对象的方法。