c++ - 如何为基于 ROM 的程序预初始化内存数据结构?

标签 c++ c data-structures rom retro-computing

考虑 STL 的 unordered_map。相同的模板类用于在运行时生成的哈希表,以及由编译时常量值组成的哈希表。虽然最新版本的 C++ 添加了 constexpr 支持,但它没有扩展到涉及自由存储的更复杂的操作,因此从编译时常量构建哈希表仍然必须在运行时进行,这使得它与在运行时构建任何其他哈希表。

理想情况下,一个完美的编译器会看到这一点并在编译时预先评估哈希表构造并将其直接嵌入到程序中。

这让我想到了逆向计算和微 Controller ,考虑到汇编的开发成本,可以想象它们的软件是用 C 或 C++ 编写的:这些环境通常有有限的 RAM 但有大量的 ROM,以及那些内存中的数据结构(例如unordered_map) 当然可以在编译时预先生成并保存到 ROM。

如前所述,对于非平凡的 constexpr,C++ 语言不支持此功能。我知道你可以一起破解这个假设你可以将你的复杂数据结构基于数组类型或将其减少到 constexpr - 或者将它们全部写在汇编中并手动设置结构的每个字节在十六进制编辑器中,并希望它与编译器对您的 struct 类型的表示相匹配(例如)。

那今天是怎么做到的呢?在 RAM 和 CPU 周期非常宝贵的 16 位和 32 位游戏机时代,它是如何实现的?我特别热衷于了解基于 ROM 卡带的游戏,其中的结构可以作为原始内存立即访问。

最佳答案

在 C++ 微 Controller 系统中,所有具有静态存储持续时间的对象的构造函数在启动期间被调用,围绕 .data.bss 等段被初始化的点,在调用 main() 之前。这是 C++ 往往不适合此类系统的几个原因之一——它实际上在启动阶段执行应用程序代码。

你提到的那种应用程序,比如老式视频游戏,很可能有预先计算好的表格并用 ROM 编写。我怀疑 C++ 是否在此类游戏中被大量使用,或者如果是,它们使用了该语言的一个受限子集。

关于c++ - 如何为基于 ROM 的程序预初始化内存数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51074075/

相关文章:

c++ - O(2m+n) 和 O(kn) 的时间复杂度

c++ - union 初始化列表的正确格式是什么?

java - 处理循环特殊情况

c++ - 有没有一种方法可以有效地进行小的固定范围乘法?

c - C中有向图中的DFS遍历

c++ - 为什么这个公共(public)成员函数是 "undefined"? (C++)

c++ - 使用 boost::proto 在 C++ 中编写 DSL

c++ - 错误 C2143 : syntax error : missing '{' before '*'

java - 多重预订系统

java - 使用递归修剪二叉搜索树