任何人都可以解释常量或常量变量存储在哪里?

时间:2013-08-01 01:08:21

标签: c++ memory constants

众所周知,C ++的内存模型可以分为五个块:堆栈,堆,空闲块,全局/静态块,const块。我可以理解前三个块,我也知道static int xx之类的变量存储在第4个块中,还有“hello world”-string常量,但是存储在第5个block-const块中的是什么?和int a = 10一样,“10”存储在哪里?有人可以向我解释一下吗?

非常感谢。

2 个答案:

答案 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个)。