在嵌入式程序中,我有一个屏幕对象,需要管理要显示的项目列表。初始项目列表将在屏幕加载时从一个简单的数据库中提取,并且该列表将通过“添加”和“删除”事件进行更新。此列表需要根据某些标准进行排序。我正在寻找可以帮助我完成此任务的容器类。此外,系统中没有动态内存,因此我需要一个空项目的内存池,我可以将其加载到容器中,并在完成项目后返回到空闲池。
有人知道 C++ 标准库或 Boost 中有什么合适的吗?或者也许是另一种解决方案?
在嵌入式程序中,我有一个屏幕对象,需要管理要显示的项目列表。初始项目列表将在屏幕加载时从一个简单的数据库中提取,并且该列表将通过“添加”和“删除”事件进行更新。此列表需要根据某些标准进行排序。我正在寻找可以帮助我完成此任务的容器类。此外,系统中没有动态内存,因此我需要一个空项目的内存池,我可以将其加载到容器中,并在完成项目后返回到空闲池。
有人知道 C++ 标准库或 Boost 中有什么合适的吗?或者也许是另一种解决方案?
为什么不使用 STL 而是提供自己的分配器和释放器,例如 STL 向量定义为template<class T,class A = std::allocator<T>> vector {}
,您可以创建和设置自己的分配器,从内存池中请求内存空间。
至于内存分配器,您可以使用现有的内存分配器,例如 Hoard http://www.hoard.org/或 Ned Allocator http://www.nedprod.com/programs/portable/nedmalloc/,这是相当高性能和良好的用于嵌入式系统。
如果您使用标准容器(例如std::map
或std::set
),您需要担心不同的动态分配:内部容器数据结构的分配和您自己想要存储在容器中的数据的分配。内部数据结构的分配可以通过提供您自己的 std::allocator 来定制(我相信您将能够找到一个适合您需要的,有很多可用的)。您自己的数据结构的分配需要单独处理,最常见的是通过实现类型特定new
和delete
运算符。Scott Meyers 在他的一本书中有一篇很好的文章。
另一种解决方案是使用 Boost.Intrusive,这是一组容器,其中容器所需的所有内部数据项都存储在您自己的数据结构中(这就是它们被称为侵入式的原因)。这使您不必使用两种不同的分配方案,因为您只需要担心自己的数据分配。