在内存限制的嵌入式系统中使用boost

时间:2008-10-03 12:18:57

标签: c++ boost embedded windows-ce

我们正在使用c ++开发在嵌入式系统上运行在Windows CE 4中的应用程序。

我们的一个限制是应用程序使用的所有内存都应在仅启动期间分配。我们写了很多只使用预分配内存而不是分配新内存的容器和算法。

您是否认为我们可以在这些条件下使用boost库而不是我们自己的容器?

欢迎任何意见和/或建议!

非常感谢,

尼克

6 个答案:

答案 0 :(得分:13)

我们对嵌入式系统使用boost 。通过提升,您可以选择您使用的内容。我们在所有项目中都使用 smart_ptr boost::bind 。我们为廉价手机编写软件。 如果Windows CE可以在您的硬件上运行,我希望部分提升适用。 有些部分的boost没有分配,你可能会觉得它们很有用。

我会根据您的要求选择

与您使用的任何内容一样,您需要知道成本。

答案 1 :(得分:6)

您可以为容器编写自己的分配器,该分配器从固定大小的静态缓冲区分配。根据容器的使用模式,分配器可以像递增指针一样简单(例如,当你在app启动时只将东西插入容器时,不要连续添加/删除元素。)

答案 2 :(得分:2)

用Boost容器替换容器不是一个好主意。制作适当的自定义分配器的工作并不会那么糟糕,但是你违反了“启动时分配”规则的精神。这条规则背后的想法(根据我的经验)通常是为了确保您不必在运行时处理内存类型不足的情况。我们的想法是确保你在开始时拥有你可能需要的所有内存,这样系统的任何部分都不可能在以后出现内存不足的情况。

如果您将Boost容器与自定义分配器一起使用,您将突然不得不处理容器分配的池可能变空的可能性,从而消除了“启动时分配”规则的目的。 / p>

在有限的内存设备的情况下,我会避免任何类型的容器比静态分配的数组更复杂。

答案 3 :(得分:1)

Boost是一组库。其中一些专注于模板元编程。那些甚至在运行时都没有使用任何内存。但你的问题似乎是关于更换你的容器。我怀疑除了使用自定义分配器之外是可能的。但即便如此,你很可能会使用普通的STL容器,而不是提升。对于那些尚未包含TR1的编译器,Boost仅提供TR1容器。

答案 4 :(得分:0)

不要使用Boost。

这是一个很大的库,你的基本内存分配要求与图书馆设计师的要求非常不同。

即使您可以根据自己的要求使用自定义分配器获得当前版本的Boost,它也可能会破坏新版本的Boost。

尽管有一些有用的想法,请随意查看Boost源代码,但请根据需要使用自己的实现。

答案 5 :(得分:0)

我现在正在研究这个问题 - 我想使用循环缓冲区,无锁容器和异步I / O,而不是分配动态内存,我更喜欢使用内存池

到目前为止我遇到的最大问题是shared_ptr在很多地方使用,没有简单的方法可以用intrusive_ptr替换它。由于shared_ptr分配动态内存以跟踪引用计数,因此我无法在嵌入式系统中使用它。

修复此问题看起来可行,但需要做很多工作 - 我必须扩展包含shared_ptr的任何类的模板规范,以便可以将特定类型的共享指针更改为intrusive_ptr如果需要的话因此,现在我必须考虑将要做多少工作,以及编写我自己需要的Boost功能版本的工作量。不是一个愉快的地方。

我希望有人指出为什么我错了。