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

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

最佳答案

通常,侵入式集合在内存使用方面是最有效的。如果您的目标是挤压每个最后一个 CPU 周期,那是唯一的出路。

考虑一个 boost 共享指针列表。创建新对象时会发生以下情况:

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

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

    现在考虑使用侵入式列表。对于相同的任务,会发生以下情况:
  • 分配并初始化一个新对象
  • list::insert 只是分配给对象的列表节点指针,因为该节点嵌入在对象中并且已经被分配

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

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

    关于c++ - Boost::Intrusive for HPC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6882097/

    10-09 23:02
    查看更多