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

11

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

我们的一个限制条件是该应用程序使用的所有内存都必须在启动时分配,而不得在其它时间进行内存分配操作。我们编写了许多容器和算法,这些容器和算法只使用预先分配的内存,而不会重新分配新的内存。

您认为在这种情况下,我们能否使用 Boost 库来代替我们自己编写的容器呢?

欢迎提出任何意见和建议!

非常感谢,

Nic


正如一些答案所指出的那样,Boost是许多库的集合,每个库通常可以单独使用。如果您能指定您考虑的Boost的哪些部分,您可能会得到更有用的答案。 - jwfearn
6个回答

15
我们在嵌入式系统中使用boost。使用boost可以挑选你需要的内容。我们在所有项目中都会使用smart_ptr和boost::bind。我们为廉价手机编写软件。 如果Windows CE可以运行在你的硬件上,我预计部分boost组件也将适用。 boost的一些部分没有分配,你可能会发现它们有用。 基于您的需求,我建议您选择性地挑选所需的组件。 像任何你使用的东西一样,你需要知道成本。

这些廉价手机的内存限制是什么? - Alex Brooks
5
最近我在一台带有6K RAM和64K Flash的MSP430微控制器上使用了Boost库。随意选择。 - Ted

6
您可以为容器编写自己的分配器,该分配器从固定大小的静态缓冲区中分配。根据容器的使用模式,分配器可能非常简单,例如只需增加指针(例如,在应用程序启动时仅将内容插入到容器一次,并且不断添加/删除元素时)。

根据我的经验,一些Boost库将使用用户指定的STL风格分配器,而另一些则不会。有些允许使用其他API进行用户定义的内存分配。我怀疑有些甚至同时具备以上所有功能。不幸的是,我还没有找到一个可靠的列表来区分它们。 - jwfearn

2
用Boost容器替换您的容器并不是一个好主意。制作适当的自定义分配器的工作可能并不那么糟糕,但您将违反“启动时分配”规则的精神。这个规则背后的想法(根据我的经验)通常是确保您在运行时不必处理内存不足的情况。这个想法是确保您在开始时拥有所有可能需要的内存,以便系统的任何部分在后来都不会出现内存不足的可能性。
如果您使用带有自定义分配器的Boost容器,您将突然面临容器分配的池可能会耗尽的可能性,从而消除了“启动时分配”规则的目的。
在有限内存设备的情况下,我会避免使用比静态分配数组更复杂的任何容器。

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

1

不要使用Boost。

这是一个庞大的库,您的基本内存分配需求与库设计者的需求非常不同。

即使您可以使用自定义分配器使当前版本的Boost按照您的要求工作,它也可能会在新版本的Boost中出现问题。

可以随意查看Boost源代码以获取一些有用的想法,但对于您需要的内容,请使用自己的实现。


Boost 的新版本不一定会在用户提供的分配器上出现故障。不幸的是,这完全取决于我们谈论的众多 Boost 库中的哪一个以及它们是否使用用于用户定义分配的 API。 - jwfearn
请问您能否详细说明版本号,以便我们做笔记。谢谢。 - daparic

0

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

到目前为止,我看到的最大问题是,在许多地方都使用了 shared_ptr,没有简单的方法可以将其替换为 intrusive_ptr。由于 shared_ptr 分配动态内存来跟踪引用计数,所以我不能在嵌入式系统中使用它。

解决这个问题看起来是可行的,但需要大量工作——我必须扩展包含 shared_ptr 的任何类的模板规范,以便在需要时可以将共享指针的特定类型更改为 intrusive_ptr。现在我必须考虑这将需要多少工作,与编写我需要的 Boost 特性的工作量相比如何。这不是一个愉快的地方。

我希望有人指出我错在哪里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接