11

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

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

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

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

非常感谢,

网卡

4

6 回答 6

15

我们将 boost 用于嵌入式系统。借助 boost,您可以选择使用的内容。我们 在所有项目中使用smart_ptr和。我们为廉价手机boost::bind编写软件。如果 Windows CE 可以在您的硬件上运行,我希望部分 boost将适用。boost 的某些部分没有分配,您可能会发现它们很有用。

我会根据您的要求进行挑选。

就像您使用的任何东西一样,您需要知道成本。

于 2008-10-04T04:49:41.237 回答
6

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

于 2008-10-03T12:32:31.943 回答
2

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

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

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

于 2009-01-06T15:16:43.723 回答
1

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

于 2008-10-03T15:30:18.933 回答
0

不要使用升压。

它是一个大库,您的基本内存分配要求与库设计者的要求大不相同。

即使您可以使用自定义分配器根据您的要求使当前版本的 Boost 工作,它也可能会因新版本的 Boost 而中断。

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

于 2008-10-03T15:42:14.697 回答
0

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

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

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

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

于 2017-06-14T22:59:31.807 回答