众所周知,C ++的内存模型可以分为五个块:堆栈,堆,空闲块,全局/静态块,const块。我可以理解前三个块,我也知道static int xx
之类的变量存储在第4个块中,还有“hello world”-string常量,但是存储在第5个block-const块中的是什么?和int a = 10
一样,“10”存储在哪里?有人可以向我解释一下吗?
非常感谢。
答案 0 :(得分:2)
字符串文字和原始常量之间存在差异。字符串文字通常与代码一起存储在一个单独的区域中(由于历史原因,该块通常称为“文本块”)。另一方面,原始常量有点特殊:它们也可以存储在“文本”块中,但它们的值也可以“烘焙”到代码本身中。例如,当你写
// Global integer constant
const int a = 10;
int add(int b) {
return b + a;
}
返回表达式可以转换为一段完全不引用a
的代码。而不是生成看起来像这样的二进制代码
LOAD R0, <stack>+offset(b)
LOAD R1, <address-of-a>
ADD R0, R1
RET
编译器可能会生成如下内容:
LOAD R0, <stack>+offset(b)
ADD R0, #10 ; <<== Here #10 means "integer number 10"
RET
基本上,尽管存储了其余的常量,但a
已从编译的代码中删除。
就整数文字常量而言,它们根本没有地址:它们总是被“烘焙”到代码中:当您引用它们时,生成加载显式值的指令,其方式与上面所示的相同。 / p>
答案 1 :(得分:1)
,和int a = 10一样,&#34; 10&#34;存储
这是一个实施细节。很可能是生成的代码的一部分,并变成类似
的东西mov eax, 10
在集会中。
像
这样的定义也会发生同样的情况const int myConst = 10;
除非您尝试获取myConst的地址:
const int *ptr = &myConst;
在这种情况下,编译器必须将值10放入专用的内存块(可能是你的数字中的第5个)。