代码之家  ›  专栏  ›  技术社区  ›  Dai

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

  •  3
  • Dai  · 技术社区  · 6 年前

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

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

    它让我想到了RealCalm和McRead,他们可以设想他们的软件是用C或C++编写的,考虑到汇编的开发成本:这些环境经常有有限的RAM,但有大量的ROM,以及那些内存数据结构(比如AN)。 无序的地图 )当然可以在编译时预先生成并持久化到ROM中。

    如上所述,C++语言不支持非平凡语言。 常量表达式 .我知道,如果可以将复杂的数据结构建立在数组类型的基础上,或者将其简化为 常量表达式 -或者将其全部写入程序集中,并在十六进制编辑器中手动设置结构的每个字节,希望它与 struct 类型(例如)。

    那么今天怎么样?在16位和32位游戏机时代,RAM和CPU周期都很昂贵,这是如何做到的呢?我特别热衷于学习基于只读存储器的游戏,在这种游戏中,结构可以作为原始存储器立即访问。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Lundin    6 年前

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

    你提到的应用程序,比如旧的电子游戏,很可能有预先计算的表和写在ROM中。我怀疑C++在这类游戏中被大量使用,或者如果是,他们使用了受限的语言子集。

        2
  •  2
  •   R.. GitHub STOP HELPING ICE    6 年前

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

    推荐文章