我们正在使用 c++ 开发在嵌入式系统上的 Windows CE 4 中运行的应用程序。
我们的限制之一是应用程序使用的所有内存只能在启动期间分配。我们编写了很多只使用预分配内存而不是分配新内存的容器和算法。
您认为在这些情况下我们可以使用 boost 库而不是我们自己的容器吗?
欢迎任何意见和/或建议!
非常感谢,
网卡
我们正在使用 c++ 开发在嵌入式系统上的 Windows CE 4 中运行的应用程序。
我们的限制之一是应用程序使用的所有内存只能在启动期间分配。我们编写了很多只使用预分配内存而不是分配新内存的容器和算法。
您认为在这些情况下我们可以使用 boost 库而不是我们自己的容器吗?
欢迎任何意见和/或建议!
非常感谢,
网卡
我们将 boost 用于嵌入式系统。借助 boost,您可以选择使用的内容。我们 在所有项目中使用smart_ptr
和。我们为廉价手机boost::bind
编写软件。如果 Windows CE 可以在您的硬件上运行,我希望部分 boost将适用。boost 的某些部分没有分配,您可能会发现它们很有用。
我会根据您的要求进行挑选。
就像您使用的任何东西一样,您需要知道成本。
您可以为容器编写自己的分配器,该分配器从固定大小的静态缓冲区进行分配。根据容器的使用模式,分配器可以像递增指针一样简单(例如,当您只在应用程序启动时将内容插入容器一次,并且不连续添加/删除元素时。)
用 Boost 容器替换你的容器不是一个好主意。制作适当的自定义分配器的工作不会那么糟糕,但是您会违反“在启动时分配”规则的精神。这条规则背后的想法(根据我的经验)通常是为了确保您不必在运行时处理内存不足类型的情况。这样做的目的是确保您一开始就拥有您可能需要的所有内存,这样以后系统的任何部分都不会出现内存不足的情况。
如果您将 Boost 容器与自定义分配器一起使用,您将突然不得不处理容器从中分配的池可能变空的可能性,从而消除了“启动时分配”规则的目的。
在内存设备有限的情况下,我会避免使用任何比静态分配数组更复杂的容器。
Boost 是一组库。其中一些专注于模板元编程。那些甚至在运行时不使用任何内存。但你的问题似乎是关于更换你的容器。除了使用自定义分配器之外,我怀疑这是可能的。但即便如此,您很可能会使用普通的 STL 容器而不是 boost。Boost 只为那些还没有包含 TR1 的编译器提供 TR1 容器。
不要使用升压。
它是一个大库,您的基本内存分配要求与库设计者的要求大不相同。
即使您可以使用自定义分配器根据您的要求使当前版本的 Boost 工作,它也可能会因新版本的 Boost 而中断。
尽管有一些有用的想法,但请随意查看 Boost 源代码,但根据需要使用您自己的实现。
我现在正在研究这个——我想使用循环缓冲区、无锁容器和异步 I/O,而不是分配动态内存,我更喜欢使用内存池。
到目前为止我看到的最大问题是它shared_ptr
在很多地方都使用过,没有简单的方法可以用intrusive_ptr
. 由于shared_ptr
分配动态内存来跟踪引用计数,因此我不能在嵌入式系统中使用它。
解决这个问题看起来可行,但需要做很多工作——我必须扩展任何包含 a 的类的模板规范,shared_ptr
以便可以根据需要更改共享指针的特定类型intrusive_ptr
。所以现在我必须考虑这将是多少工作,以及编写我自己需要的 Boost 功能版本的工作量。不是一个令人愉快的地方。
我希望有人指出我为什么错了。