boost :: intrusive库对高性能计算有多好?
我想将容器用于不可复制的不可赋值类.我打算用
正常STL与shared_ptr.我发现boost :: intrusive也可以用于相同的目的.所以我的问题是,他们真的那么高效吗?
如果在具有shared_ptr类型的STL容器和boost :: intrusive之间给出一个选项,您更喜欢哪一个?
最佳答案 通常,就内存使用而言,侵入式集合是最有效的.如果你的目标是挤压每一个最后的cpu周期,这是唯一的方法.
考虑一下boost共享指针的列表.创建新对象时会发生以下情况:
>从堆分配并初始化的对象
>来自原始指针的boost共享指针的构造函数在堆上分配另一个对象来存储object’a引用计数器(这就是为什么boost入侵指针更好,因为引用计数器存储在对象中避免了这种分配)
> list :: insert分配一个列表节点并复制共享指针
在上文中,有三个内存分配用于创建新对象并将其插入到集合中.
现在考虑使用侵入式列表.对于同样的任务,会发生什么:
>分配并初始化一个新对象
> list :: insert只分配给对象的列表节点指针,因为节点嵌入在对象中并且已经分配
这里只发生一次内存分配.由于cpu在使用侵入式集合时会占用更少的内存,因此可以更好地利用cpu缓存,从而减少缓存未命中以及减少内存占用(称为参考原则的位置).
侵入式集合的缺点是必须事先知道对象可以是什么类型以及有多少集合可以同时成为元素.根据我的个人经验,这种额外的前期思考可以使设计更简洁,更简单.