【问题标题】:Lightweight STL alternative to std::mapstd::map 的轻量级 STL 替代品
【发布时间】:2014-07-09 19:07:32
【问题描述】:

我正在嵌入式系统上编写应用程序。我需要某种类型的关联容器才能访问基于字符串的某个指针。目前我正在使用地图(即std::map<char*, SomeType*, CustomComparator>)。我使用 char* 作为键类型,因为我正在与其他必须支持 std::string 的库进行通信,并且我不想继续来回转换。
但我遇到了一个意想不到的问题。 std::map 的每个实例(即新类型)在生成的二进制文件中占用大约 10Kb(没有优化,用于调试目的)。由于我的 ROM 被限制在 500Kb 左右,而且我可能需要几十个,这是一个相当大的缺点(我想在实际硬件上进行调试,如果程序不适合我就不能这样做) .如果可能的话,我希望能够在对数时间内访问这些项目。我不想诉诸于使用数组并循环遍历每个项目,直到找到我正在寻找的那个。插入不必很快,因为这仅在启动期间完成。删除仅在关机期间执行,因此它们也不是问题。
有没有人有我可以使用的替代想法(最好是 STL)?
注意:我仅限于 C++03。

【问题讨论】:

  • std::map 的每个实例是指std::map 的单独实例化还是std::map 相同类型的实例?
  • “std::map 的每个实例在生成的二进制文件中占用大约 10Kb”。你如何创建实例?你是怎么测量尺寸的?
  • 您是否考虑过使用已排序的std::vectorstd::lower_bound?无开销的对数访问。原因插入和删除变得缓慢。
  • 好的,我现在看到您已经回答了另一条评论中的第一个问题。我只能重复一遍:别担心,要快乐。这 10Kb 的大部分是调试信息。它是为每种新类型单独创建的。它将在发布 exe 中全部消失。如果您仍然担心,请将std::map<char*, void*, CustomComparator>) 包裹在一个薄的、完全内联的、模板化的类型安全层中。程序执行时调试信息甚至不应该加载到内存中,它位于文件中并且只能由调试器读取,因此您的 RAM 大小无关紧要(磁盘大小)。

标签: c++ stl embedded containers c++03


【解决方案1】:

明显的解决方案可能是在后台使用std::map<const char *, void *, CustomComparator>,并将类型转换包装在具有内联函数的模板接口下。这应该消除为每种不同的指针类型生成不同类型的std::map

【讨论】:

  • 好地方(没有任何发现的地方)!
  • 这是个好主意。我还将看看 boost::flap_map 和 std::vector 与 std::lower_bound 的想法。如果他们是答案,我也会赞成他们。
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 2014-04-23
  • 2011-07-18
  • 2013-08-01
  • 1970-01-01
  • 2010-09-22
  • 2010-09-09
相关资源
最近更新 更多