【发布时间】:2019-04-24 13:59:19
【问题描述】:
我是 C++ 中引用概念的新手,我有一个关于引用纯数字常量的内存分配的问题。 (我首先要检查的另一件事是我怀疑我经常遇到的 const reference 表示 reference to const,但我不确定。)
#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;
}
结果:
0x7ffee3bd74c4
0x7ffee3bd74c8
0x7ffee3bd74cc
0x7ffee3bd74cc
r2 与r3 相同的原因从answer - How does a C++ reference look, memory-wise? 中可以清楚地看出,它说这取决于编译器。但我在想为什么编译器不也使r0,r1,r2 都一样,因为它们都具有相同的纯常量值123。 (如果没有错误搜索,则称为prvalue)
作为说明:在此站点上进行了一些搜索后,我找到了一个最相关的question - but in python。虽然语言不同,但我认为这个想法应该是相同/相似的:从链接中,如果我的程序是用 python 编写的,那么内存空间中将只有一个 123 以节省空间。
我读过的其他一些答案:
-
C++ do references occupy memory:这个答案表明,如果有必要,那么
int &x被实现为*(pointer_to_x)。 - How does a C++ reference look, memory-wise?:这个答案表明编译器会尽力节省空间。
【问题讨论】:
-
我怀疑答案是因为您在没有开启任何优化的情况下运行了代码。
-
@MooingDuck:在我睡着之前,我正在(重新)考虑 C++ 是否会像 python 一样进行优化,然后现在我醒来并意识到它应该是相反/相反的问题或 C++ 应该更好地处理它。当 C++ 这样做时,规范的方式/机制是什么?
-
默认情况下,编译器会生成未优化的构建,这使得单步调试和调试远变得更容易。然而,每个编译器也有一个你可以传递的标志,告诉它构建一个优化的构建,这将缩小它并使其快速和小。你是如何编译你的代码的?
-
@MooingDuck:我刚刚在ideone.com 上单击了运行,我确实尝试在那里找到所谓的优化选项,但似乎他们没有。因为我很少考虑优化,所以我对优化的了解不多。
-
ptr_user7813604 coliru.stacked-crooked.com 允许您将 -O0 到 -O3 标志传递给编译器,让您看到各种结果。 (-O0 是默认不优化,-O3 是最大优化)