【问题标题】:Using boost in embedded system with memory limitation在内存限制的嵌入式系统中使用 boost
【发布时间】:2010-09-15 01:22:52
【问题描述】:

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

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

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

欢迎任何 cmets 和/或建议!

非常感谢,

网卡

【问题讨论】:

  • 正如一些答案所指出的,Boost 是一组许多库,通常每个库都可以单独使用。如果您可以指定您正在考虑的 Boost 部分,您可能会得到更有用的答案。

标签: c++ boost embedded windows-ce


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    我会根据您的要求挑选

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

    【讨论】:

    • 那些廉价手机的内存限制是什么?
    • 我最近在具有 6K RAM 和 64K 闪存的 MSP430 micro 上使用了 boost。只需选择即可。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      不要使用 Boost。

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

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

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

      【讨论】:

      • 新版本的 Boost 不一定会在用户提供的分配器上中断。不幸的是,这完全取决于我们正在讨论的众多 Boost 库中的哪一个以及它们用于用户定义分配的 API(如果有的话)。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 根据我的经验,一些 Boost 库将使用用户指定的 STL 样式分配器,而有些则不会。有些允许使用其他 API 进行用户定义的内存分配。我怀疑有些人甚至会做以上所有事情。不幸的是,我还没有找到一个可靠的清单。
        猜你喜欢
        • 2012-03-25
        • 2019-05-24
        • 1970-01-01
        • 2012-04-17
        • 2021-10-30
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2014-04-14
        相关资源
        最近更新 更多