c++中用于常量数据的内存存储

memory storage for constant data in c++

本文关键字:内存 存储 数据 常量 用于 c++      更新时间:2023-10-16

如C++完整参考中所述,常量数据存储在ROM中。但局部变量存储在堆栈内,堆栈在RAM中。那么,如果我们声明局部常量数据,它存储在哪里?RAM还是ROM?

唯一可能的正确答案是"它取决于"。

C++是硬件之上的一个抽象级别,它生成的代码可能由操作系统等其他软件">托管"。

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

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

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

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

无论如何,除非你自己对硬件进行编程,否则你不会在意这些细节。说"常数可以存储在ROM中"可能是真的(如果平台允许的话),但"常数存储在ROM"只是一个彻头彻尾的谎言。

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

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

至于存储内容的位置,在当前的体系结构中有一些典型的做法。但是编译器可以自由地做出自己的决定。例如:

字符串文字:它们去哪里?

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