我对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在内存空间中只有一个用于节省空间.
我读过的其他一些答案:
int &x实现为*(pointer_to_x).你123不是一个"常数".相反,它是一个文字.文字形成一个表达式,它是一个prvalue(即一个用文字给定的值初始化的临时对象).当您将该表达式绑定为引用时,该对象的生命周期将扩展为引用的生命周期,但重要的一点是每个此类对象都是一个不同的对象,因此具有不同的地址.
如果愿意,文本字符串"123"提供了如何创建对象的规则,但它本身不是对象.您可以重写代码以使其更明确:
const int & r = int(123); // temporary of type "int" and value "123"
Run Code Online (Sandbox Code Playgroud)
(在C++中没有单一的"常量"这样的东西.有很多东西在某种程度上是不变的,但它们都需要更详细的考虑.)