【问题标题】:can anyone explain where the constants or const variables stored?谁能解释常量或常量变量的存储位置?
【发布时间】:2013-08-01 01:08:21
【问题描述】:

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

非常感谢。

【问题讨论】:

  • C++ 没有强加特定的内存模型。对于所有的语言问题,一切都可以存储在堆上。
  • 如果你解释它们之间的区别 - 我将能够解释第五个......
  • 10 本身并不存储在任何地方,它是一个用于初始化变量的值。变量本身使用的内存取决于变量的定义方式。
  • 第5块有什么用?
  • 你应该熟悉storage durationvalue categories

标签: c++ memory constants


【解决方案1】:

字符串字面量和原始常量之间是有区别的。字符串文字通常与代码一起存储在单独的区域中(由于历史原因,该块通常称为“文本块”)。另一方面,原始常量有些特殊:它们也可以存储在“文本”块中,但它们的值也可以“烘焙”到代码本身中。例如,当你写

// 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 已从编译代码中删除。

就整数字面量常量而言,它们根本没有地址:它们总是被“烘焙”到代码中:当您引用它们时,会生成加载显式值的指令,与上面所示的方式相同。

【讨论】:

  • 好的,现在我明白了,我有一个不同的问题。在什么情况下编译器可以在编译代码时为变量分配内存?
  • @XiaosongHe 当变量是常量,并且你不请求它的地址或产生对它的引用时。
【解决方案2】:

和 int a = 10 一样,“10”存储在哪里?

这是一个实现细节。可能会成为生成代码的一部分并变成类似

mov eax, 10

在装配中。

类似的定义也会发生类似情况

const int myConst = 10;

除非你尝试这样获取 myConst 的地址:

const int *ptr = &myConst;

在这种情况下,编译器必须将值 10 放入专用内存块中(大概是您计算中的第 5 个)。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多