【问题标题】:boost::pool_allocator needs eight static libraries?boost::pool_allocator 需要八个静态库?
【发布时间】:2013-07-14 06:04:47
【问题描述】:

我试图从 Boost 库中向我的项目添加相当有限的功能,即在“pool_allocator”类的帮助下为池中的小对象分配内存,并发现我需要将项目依赖项添加到 4调试静态库文件和 4 发布静态库文件。 IE。单行需要 8 个库文件依赖项,如下所示:

boost::container::vector<int, boost::pool_allocator<int> > v;

有没有办法在不链接到静态库的情况下使用这些类? (可能是模板参数的某种组合?)

【问题讨论】:

  • 所以它确实需要 4 个库——你在发布和调试中使用不同的库这一事实并不重要,它仍然只是一个库(两个变体是从相同的源代码构建的)。而且我很确定有些库不是用于池分配器,而是用于vector 部分....
  • 我正在等待模块:isocpp.org/blog/2012/11/…
  • Mats Petersson - 实际上所有四个库都与多线程有关。它们是:date_time、thread、chrono 和 system。

标签: c++ memory-management boost allocation boost-pool


【解决方案1】:

我所读到的关于 boost pool 的全部内容是:根本不要使用它。该库相当旧(在 boost 1.54 中,所有文件的版权均为 2000 和 2001,除了 pool_alloc.hpp,它于 2010 年编辑)您可以查看here 以了解有关性能的问题(寻找 James Kanze 的答案)。如果您只想使用 boost,我建议您使用另一个库。如果您需要自定义分配器,请执行基准测试。

编辑:

来自Pools docu

一般来说,当您需要一种更有效的方式来进行异常内存控制时,请使用池。

那么问题是什么是异常内存控制?它是否满足您对记忆的特殊需求? Andrei Alexandrescu 在“现代 C++ 设计”中写过关于内存分配的文章,并且根据分配 释放模式可能会有非常不同的要求。但根据paper,他不相信这是一个非常好的章节。

所以对我来说最后一个问题是对于内存管理问题,pool 是否比 std::allocator 更好?你必须弄乱它。即使在池中实现的逻辑很少,也可能在您的实现中使用更有效的内存管理算法。顺便说一句,池的错误之一是"Boost pool library it not header only as claimed in documentation"

【讨论】:

  • Boost::pool_allocator 使用具有简单隔离存储的池作为基础,不包含太多逻辑,但通过频繁的小堆分配显着提高了代码速度(仅在发布版本中;在调试版本中,Boost 的池分配器比默认的慢得多)。 pool_allocator 在附加库依赖方面的主要开销来自多线程问题。因此,似乎值得在没有多线程的情况下使用池并在需要时实现自己的同步。
  • 有人可以建议如何在没有多线程的情况下声明“pool_allocator”(可能使用“boost::details::pool::null_mutex”?)并且其余模板参数为默认值?
  • @ Jan :谢谢,Jan。这篇论文内容丰富,第二个链接包含主题问题的解决方案。
【解决方案2】:

识别 boost 所需的文件,并将它们单独添加到您的项目中,或者将 .cpp 添加到您的项目中,#include 是所需的 .cpp。 (不太推荐)

通过脚本生成您的项目文件,以便轻松添加此类依赖项。设置它很痛苦,但拥有它很棒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多