为什么引用相同的常量会占用C++中不同的内存空间?

Bin*_*eee 3 c++ reference

我对C++中引用的想法不熟悉,我有一个关于引用纯数字常量的内存分配的问题.(我想先检查的另一件事是我怀疑const引用,我经常遇到它,意味着引用const,但我不确定.)

这是我在ideone.com上的测试:

#include <stdio.h>

int main() {

    const int r0 = 123;
    const int &r1 = 123;
    const int &r2 = 123;
    const int &r3 = r2;

    printf("%p\n", (void *)&r0);
    printf("%p\n", (void *)&r1);
    printf("%p\n", (void *)&r2);
    printf("%p\n", (void *)&r3);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

0x7ffee3bd74c4
0x7ffee3bd74c8
0x7ffee3bd74cc
0x7ffee3bd74cc
Run Code Online (Sandbox Code Playgroud)

原因与此答案清楚r2相同- C++参考如何看待内存?,这说它取决于编译器.但是我在想,为什么编译器不也令,,都是一样的,因为所有具有相同的纯恒定值.(如果没有错误的搜索,则称为prvalue)r3r0r1r2123

作为一个注释:经过对该网站的一些搜索,我发现了一个最相关的问题 - 但在python中.虽然不同的语言,但我认为这个想法应该是相同/相似的:从链接,如果我的程序是用python编写的,那么123在内存空间中只有一个用于节省空间.

我读过的其他一些答案:

  1. C++做引用占用内存:这个答案表明如果有必要那么int &x实现为*(pointer_to_x).
  2. 内存方面的C++引用如何?:这个答案表明编译器会尽力节省空间.

Ker*_* SB 6

123不是一个"常数".相反,它是一个文字.文字形成一个表达式,它是一个prvalue(即一个用文字给定的值初始化的临时对象).当您将该表达式绑定为引用时,该对象的生命周期将扩展为引用的生命周期,但重要的一点是每个此类对象都是一个不同的对象,因此具有不同的地址.

如果愿意,文本字符串"123"提供了如何创建对象的规则,但它本身不是对象.您可以重写代码以使其更明确:

const int & r = int(123);   // temporary of type "int" and value "123"
Run Code Online (Sandbox Code Playgroud)

(在C++中没有单一的"常量"这样的东西.有很多东西在某种程度上是不变的,但它们都需要更详细的考虑.)