以下代码显示了使用const
变量i
时使用gcc和g ++的不同输出。
i
的地址和ptr
的值相同,但在通过打印i
的值并取消参考ptr
的值访问该地址时,我获得了{{1}的值}使用g {+ i
和gcc使用5
。
g ++如何在内存中保存const变量?
10
答案 0 :(得分:8)
您正在修改const
限定对象。这在C中是不允许的(“未定义的行为”)。任何事情都可能发生。
示例:
i
放入只读内存中。写入*ptr
会导致程序崩溃。i
的所有读取访问权限(你承诺它是const
,不是吗?)。我猜C编译器选择2而C ++编译器选择3。
答案 1 :(得分:5)
其他人评论了代码正在做什么的“未定义”性质。但是要解释这是如何发生的,编译器完全有可能应用优化,而i
的运行时值永远不会传递给printf
,而是用常量替换i
5
。你确实声明它是const
所以它不应该改变。
答案 2 :(得分:3)
它可能在内存中,也可能是硬编码到您的可执行文件中。它是const
;编译器可以对它执行积极的优化。
这就是为什么你不能修改它。
答案 3 :(得分:2)
您可以取消引用/转换const
作为非成本和覆盖,但行为未定义。
由于行为未定义,您可能会得到任何结果,您不应该质疑为什么,如何等等。
一旦编译器获知您的变量为const
,就可以很好地将此变量保存在RO内存中和/或用硬编码值替换此变量的出现。除非您在代码中询问其地址,否则C ++编译器可能会选择不将内存分配给const
变量。
经验法则是,决定是否要更改变量并相应地使其变为const
。