如 C++ Complete Reference 中所述,常量数据存储在 ROM 中。但是局部变量存储在堆栈中,堆栈位于 RAM 中。那么如果我们声明局部常量数据,它存储在哪里呢?内存还是只读存储器?
3 回答
唯一真正可能的答案是“它取决于”。
C++ 是硬件之上的一层抽象,它生成的代码可能由其他软件(如操作系统)“托管”。
它使用硬件的方式取决于硬件本身是什么、工作原理和管理,以及编译器设计者打算如何使用所有这些好东西。
常量和变量之间的区别在于,变量(由语言设计者)被设计为可以修改并保留其值,而常量被设计为永远不会被修改。
C++ 关于常量的唯一说法是试图修改它们会导致“未定义的行为”:即“语言设计者对可能(或不会)发生的事情只字未提”。
编译器设计师做他们可以与他们工作的平台兼容的事情。一些常量存储在真实的 ROM 中(想想微控制器),一些在 RAM 中“写访问被拒绝”(因此,如果您尝试修改它们,则会生成硬件陷阱:会发生什么取决于操作系统:通常陷阱是翻译成该语言可能支持或不支持的操作系统异常)一些只是在不存在这种“设施”的RAM中,还有一些甚至在机器代码指令本身内部。
无论如何,除非您自己对硬件进行编程,否则您不会关心这些细节。并且说“常量可以放入 ROM”可能是真的(如果平台允许的话),但“常量存储在 ROM 中”只是一个简单的谎言。
术语“ROM”通常是为物理上无法写入的硬件保留的。常量仍然放置在物理上的“RAM”中(否则,您的程序怎么可能加载?)
从技术上讲,在规范中写入几乎没有保护......如果你这样做只是未定义的行为。
至于东西存放在哪里,目前的架构有一些典型的做法。但是编译器可以自由地做出自己的决定。看这个,例如:
运行时存储在堆栈上的本地常量数据。静态本地和全局数据通常在编译时存储在只读段中。然而,编译器可以进行一些优化,甚至将局部常量存储在只读段中。