编译期构造只读容器

💡 原文中文,约1300字,阅读约需4分钟。
📝

内容提要

在设计变频器的红外遥控处理时,作者发现使用 std::map 会占用大量内存。为了解决这个问题,作者采用 frozen 库,将 map 定义为 constexpr,在编译期构造,从而减少了运行时内存占用,虽然代码体积略微增加,但有效降低了 RAM 使用。

🎯

关键要点

  • 在设计变频器的红外遥控处理时,使用 std::map 会占用大量内存。
  • 即使将 map 定义为 const 变量,仍然会在堆内存中分配内存。
  • 构造 map 时会在运行时分配大量细碎内存块,影响内存使用。
  • 尝试使用 constexpr 修饰符构造 std::map 失败,无法在编译期构造。
  • 为了减少内存占用,作者寻找替代方案,最终选择了 frozen 库。
  • 使用 frozen 库后,代码体积略微增加,但运行时堆内存占用减少了千余字节。
  • 通过在 .rodata 段直接构造 map 容器的二叉树,减少了 RAM 的使用。

延伸问答

为什么使用 std::map 会占用大量内存?

使用 std::map 会在堆内存中分配内存,并且构造时会分配大量细碎内存块,导致内存占用增加。

如何减少变频器红外遥控处理中的内存占用?

可以使用 frozen 库,将 map 定义为 constexpr,在编译期构造,从而减少运行时内存占用。

使用 frozen 库后,代码体积会有什么变化?

使用 frozen 库后,代码体积略微增加,但运行时堆内存占用减少了千余字节。

为什么尝试使用 constexpr 修饰符构造 std::map 失败?

std::map 并不能简单地通过 constexpr 变成编译期构造,因此尝试会导致编译失败。

在 .rodata 段构造 map 容器有什么好处?

在 .rodata 段构造 map 容器可以直接在只读内存中查找,减少了 RAM 的使用。

为什么需要在编译期构造只读容器?

编译期构造只读容器可以避免在运行时分配内存,从而提高内存使用效率。

➡️

继续阅读