相同的地址显示了使用g ++编译器的const变量的不同值

时间:2014-06-26 11:51:33

标签: c++ c

以下代码显示了使用const变量i时使用gcc和g ++的不同输出。 i的地址和ptr的值相同,但在通过打印i的值并取消参考ptr的值访问该地址时,我获得了{{1}的值}使用g {+ i和gcc使用5

g ++如何在内存中保存const变量?

10

4 个答案:

答案 0 :(得分:8)

您正在修改const限定对象。这在C中是不允许的(“未定义的行为”)。任何事情都可能发生。

示例:

  1. 编译器可以将i放入只读内存中。写入*ptr会导致程序崩溃。
  2. 它可以把它放入可写的内存中,你只会看到10。
  3. 它可以将它放入可写内存中,但用{5}替换i的所有读取访问权限(你承诺它是const,不是吗?)。
  4. 我猜C编译器选择2而C ++编译器选择3。

答案 1 :(得分:5)

其他人评论了代码正在做什么的“未定义”性质。但是要解释这是如何发生的,编译器完全有可能应用优化,而i的运行时值永远不会传递给printf,而是用常量替换i 5。你确实声明它是const所以它不应该改变。

答案 2 :(得分:3)

它可能在内存中,也可能是硬编码到您的可执行文件中。它是const;编译器可以对它执行积极的优化。

这就是为什么你不能修改它

答案 3 :(得分:2)

您可以取消引用/转换const作为非成本和覆盖,但行为未定义。

由于行为未定义,您可能会得到任何结果,您不应该质疑为什么,如何等等。

一旦编译器获知您的变量为const,就可以很好地将此变量保存在RO内存中和/或用硬编码值替换此变量的出现。除非您在代码中询问其地址,否则C ++编译器可能会选择不将内存分配给const变量。

经验法则是,决定是否要更改变量并相应地使其变为const