Boost:: HPC的侵入性
Boost::Intrusive for HPC
boost::intrusive
库对高性能计算有多好?我想为一个不可复制的不可赋值类使用一个容器。我正打算用正常STL与shared_ptr
。我发现boost::intrusive
也可以用于同样的目的。所以我的问题是,他们真的那么有效率吗?
如果在具有shared_ptr
类型的STL容器和boost::intrusive
之间给出一个选项,您更喜欢哪一个?
通常,就内存使用而言,侵入式收集是最有效的。如果您的目标是压缩每一个最后的cpu周期,这是唯一的方法。
考虑一个boost共享指针列表。当创建一个新对象时发生的事情是:
- 从堆中分配并初始化的对象
- 基于原始指针的boost共享指针的构造函数在堆上分配另一个对象来存储对象的引用计数器(这就是为什么boost侵入式指针更好,因为引用计数器存储在对象中,避免了这种分配)
- list::insert分配一个列表节点并复制共享指针
在上面的例子中,创建一个新对象并将其插入到一个集合中涉及到三次内存分配。
现在考虑使用侵入式列表。对于相同的任务,发生的情况是:
- 一个新对象被分配和初始化
- list::insert只分配给对象的列表节点指针,因为节点嵌入在对象中并且已经分配了
在这里,只分配一次内存。由于使用侵入式收集时cpu地址更少,cpu缓存得到更好的利用,导致更少的缓存丢失以及更少的内存占用(称为引用局部性原则)。
侵入式集合的缺点是必须事先知道一个对象一次可以作为元素的类型和多少个集合。根据我个人的经验,这种额外的预先思考会导致更简洁的设计。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 使用Boost Interprocess创建托管共享内存需要很长时间
- Boost::posix_time::ptime舍入到给定的分钟数
- Boost:: HPC的侵入性