-1

如 C++ Complete Reference 中所述,常量数据存储在 ROM 中。但是局部变量存储在堆栈中,堆栈位于 RAM 中。那么如果我们声明局部常量数据,它存储在哪里呢?内存还是只读存储器?

4

3 回答 3

4

唯一真正可能的答案是“它取决于”。

C++ 是硬件之上的一层抽象,它生成的代码可能由其他软件(如操作系统)“托管”。

它使用硬件的方式取决于硬件本身是什么、工作原理和管理,以及编译器设计者打算如何使用所有这些好东西。

常量和变量之间的区别在于,变量(由语言设计者)被设计为可以修改并保留其值,而常量被设计为永远不会被修改。

C++ 关于常量的唯一说法是试图修改它们会导致“未定义的行为”:即“语言设计者对可能(或不会)发生的事情只字未提”。

编译器设计师做他们可以与他们工作的平台兼容的事情。一些常量存储在真实的 ROM 中(想想微控制器),一些在 RAM 中“写访问被拒绝”(因此,如果您尝试修改它们,则会生成硬件陷阱:会发生什么取决于操作系统:通常陷阱是翻译成该语言可能支持或不支持的操作系统异常)一些只是在不存在这种“设施”的RAM中,还有一些甚至在机器代码指令本身内部。

无论如何,除非您自己对硬件进行编程,否则您不会关心这些细节。并且说“常量可以放入 ROM”可能是真的(如果平台允许的话),但“常量存储在 ROM 中”只是一个简单的谎言。

于 2012-11-21T07:43:52.093 回答
1

术语“ROM”通常是为物理上无法写入的硬件保留的。常量仍然放置在物理上的“RAM”中(否则,您的程序怎么可能加载?)

从技术上讲,在规范中写入几乎没有保护......如果你这样做只是未定义的行为。

至于东西存放在哪里,目前的架构有一些典型的做法。但是编译器可以自由地做出自己的决定。看这个,例如:

字符串文字:它们去哪儿了?

于 2012-11-21T07:29:47.820 回答
1

运行时存储在堆栈上的本地常量数据。静态本地和全局数据通常在编译时存储在只读段中。然而,编译器可以进行一些优化,甚至将局部常量存储在只读段中。

于 2012-11-21T07:33:43.757 回答