我有一个基于二叉树的数据结构,可以在O(log N)
中执行所有操作。它通过new
和delete
分配/解除分配内存。在我的典型用法中,数据结构运行了 40 分钟,并分配/取消分配小块树节点五亿次。此数据结构的总体内存占用量较低,因为取消分配很快就会发生。这已被确定为性能瓶颈。
我正在考虑重载运算符new
并delete
或修改我现有的代码,以便能够使用分配器并为此目的创建自定义分配器。我正在考虑预先分配连续的大量内存,并从中重用内存块。C++11 标准是否有这种基于池的内存分配器?
哪种内存分配/取消分配策略最适合这种用法?
C++11 中没有用于内存池的现成功能。但是你可以使用Boost.Pool来达到这个目标。来自 Boost.Pool 文档:
我什么时候应该使用池?
池通常在有大量小对象的分配和取消分配时使用。另一个常见点 用法是上述情况,其中许多对象可能会被丢弃 记忆。 通常,当您需要更有效的方式来执行异常内存控制时,请使用池。
使用 C++17 std::p mr::unsynchronized_pool_resource 或同步版本。