4

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

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

4

1 回答 1

2

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

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

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

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

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

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

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

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

于 2011-07-30T11:16:35.513 回答