【问题标题】:Boost::Intrusive for HPCBoost::HPC 侵入式
【发布时间】:2011-07-30 08:51:51
【问题描述】:

boost::intrusive 库对于高性能计算有多好? 我想为不可复制的不可分配类使用容器。我打算用 带有shared_ptr 的普通 STL。我发现boost::intrusive 也可以用于相同的目的。所以我的问题是,它们真的那么高效吗?

如果在具有shared_ptr 类型和boost::intrusive 类型的 STL 容器之间给出一个选项,您更喜欢哪一个?

【问题讨论】:

    标签: c++ boost stl shared-ptr hpc


    【解决方案1】:

    通常,就内存使用而言,侵入式集合是最有效的。如果您的目标是压缩最后一个 cpu 周期,那么这是唯一可行的方法。

    考虑一个 boost 共享指针列表。创建新对象时会发生什么:

    • 从堆中分配并初始化的对象
    • boost 共享指针从原始指针的构造函数在堆上分配另一个对象来存储该对象的引用计数器(这就是为什么 boost 侵入式指针更好,因为引用计数器存储在避免这种分配的对象中)李>
    • list::insert 分配一个列表节点并复制共享指针

    在上面,创建新对象并将其插入集合中涉及三个内存分配。

    现在考虑使用侵入式列表。对于相同的任务,发生的情况是:

    • 新对象被分配和初始化
    • list::insert 只是分配给对象的列表节点指针,因为该节点嵌入在对象中并且已经被分配了

    在这里,只发生了一次内存分配。由于在使用侵入式集合时 CPU 寻址的内存更少,因此 CPU 缓存得到了更好的利用,从而减少了缓存未命中并减少了内存占用(称为局部性原则)。

    侵入式集合的缺点是它必须事先知道一个对象一次可以是什么类型和多少个集合的元素。以我个人的经验,这种额外的前期思考会带来更简洁的设计。

    【讨论】:

    • 嗨....谢谢...但是...我对最后一句话有点困惑...。您能更详细地解释一下吗?具体来说,当您说“一个对象可以在什么类型和多少个集合中成为一个元素”时,您的意思是什么?
    • 使用侵入式集合时,对象必须嵌入集合节点。因此,如果一个对象被保存在一个侵入列表中,例如,它必须嵌入一个列表节点。如果对象需要同时在两个列表中,则必须嵌入两个列表节点,依此类推。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2012-12-26
    相关资源
    最近更新 更多