c++中用于常量数据的内存存储
memory storage for constant data in c++
如C++完整参考中所述,常量数据存储在ROM中。但局部变量存储在堆栈内,堆栈在RAM中。那么,如果我们声明局部常量数据,它存储在哪里?RAM还是ROM?
唯一可能的正确答案是"它取决于"。
C++是硬件之上的一个抽象级别,它生成的代码可能由操作系统等其他软件">托管"。
它使用硬件的方式取决于硬件本身是什么、工作原理和管理方式,以及编译器设计者打算如何使用所有这些好东西。
常量和变量之间的区别在于,变量(由语言设计者)被设计为可以修改并保留其值,而常量被设计为永远不会被修改。
C++对常量唯一说的是,试图修改它们会导致"未定义的行为":也就是说,"语言设计者对可能发生(或不发生)的事情只字不提"。
编译器设计者做他们能与他们工作的平台兼容的事情。一些常量存储在真实的ROM中(想想微控制器),一些在RAM中具有"拒绝写入访问"(因此,如果您试图修改它们,就会生成硬件陷阱:发生什么取决于操作系统:通常陷阱会被转换为该语言可能支持或不支持的操作系统异常),一些只是在RAM中,不存在这样的"设施",另一些甚至在机器代码指令本身中。
无论如何,除非你自己对硬件进行编程,否则你不会在意这些细节。说"常数可以存储在ROM中"可能是真的(如果平台允许的话),但"常数存储在ROM"只是一个彻头彻尾的谎言。
术语"ROM"通常是为物理上无法写入的硬件保留的。常量仍然放在物理上的"RAM"中(否则,你的程序怎么能加载呢?)
从技术上讲,规范中几乎没有针对写入的保护……如果你这样做,那只是未定义的行为。
至于存储内容的位置,在当前的体系结构中有一些典型的做法。但是编译器可以自由地做出自己的决定。例如:
字符串文字:它们去哪里?
运行时存储在堆栈上的本地常量数据。静态本地和全局数据通常在编译时存储在只读段中。然而,编译器可以进行一些优化,甚至可以将本地常量存储在只读段中。
- 将字符串存储在c++中的稳定内存中
- 类型总是使用其大小存储在内存中吗
- 使用无符号字符数组有效存储内存
- 具有内存顺序的原子负载存储
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- 为什么 bool 和 _Bool 如果它们在内存中占用 1 个字节,它们只能存储 0 或 1
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 可用存储空间会消耗更多剩余内存吗?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 将数据存储在内存中以供以后访问
- 英特尔将指令存储在重叠的内存区域
- 关于矢量内存存储
- 如何使一个线程中的内存存储"promptly"在其他线程中可见?
- c++中用于常量数据的内存存储
- 内存存储可以在 OoOE 处理器中真正重新排序吗?
- 动态分配的内存存储说明
- 在 std::vector 中存储指针会破坏连续内存存储的优势
- #定义指令内存存储
- 跨语言的内存存储