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

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

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

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

非常感谢,

尼克

有帮助吗?

解决方案

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

其他提示

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

我会根据您的要求选择

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

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

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

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

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

不要使用Boost。

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top