3

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

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

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

如前所述,C++ 语言不支持这种非平凡的constexpr. 我知道您可以将其组合在一起,假设您可以将复杂的数据结构基于数组类型或将其简化为constexpr- 或将其全部写入汇编并在十六进制编辑器中手动设置结构的每个字节并希望它匹配编译器对您的struct类型的表示(例如)。

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

4

3 回答 3

2

unordered_map是一种效率极低的数据结构类型,您永远不会在这种设置中使用。使用静态初始化器可以轻松完成更合理的事情,例如数组和树。如果它变得更复杂,您编写一个程序来生成包含所需静态初始化程序的 C 并在可以处理它的系统上运行它。

于 2018-06-28T03:44:01.447 回答
2

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

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

于 2018-06-28T13:27:59.723 回答
0

回到“Ye Olden Days”——80 年代和 90 年代初期,RAM 非常昂贵,闪存既昂贵又不可靠,但是 ROM,尤其是掩码 ROM 很便宜。

视频游戏机通常使用少量 RAM 作为“暂存器”内存从 ROM 执行游戏。例如,最初的 NES 控制台有 2048 字节的 RAM

游戏开发中未使用编译语言,因此为了回答您的原始问题,初始化数据结构,将空结构从 ROM 复制到 RAM

于 2020-07-06T16:38:01.003 回答