基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
Memory allocator for a light tree based data structure for frequent allocation and deallocation
我有一个基于二叉树的数据结构,可以在O(log N)
中执行所有操作。它通过new
和delete
分配/解除分配内存。在我的典型用法中,数据结构运行了 40 分钟,并分配/取消分配小块树节点五亿次。此数据结构的总体内存占用量较低,因为取消分配很快就会发生。这已被确定为性能瓶颈。
我正在考虑重载运算符new
并delete
或修改我现有的代码,以便能够使用分配器并为此目的创建自定义分配器。我正在考虑预先分配连续的大量内存,并从中重用内存块。C++11 标准是否有这种基于池的内存分配器?
哪种内存分配/取消分配策略最适合这种用法?
C++11 中没有用于内存池的现成功能。但是你可以使用Boost.Pool来达到这个目标。来自 Boost.Pool 文档:
我什么时候应该使用池?
池通常在有大量小对象的分配和取消分配时使用。另一个常见点 用法是上述情况,其中许多对象可能会被丢弃 记忆。 通常,当您需要更有效的方式来执行异常内存控制时,请使用池。
使用 C++17 std::p mr::unsynchronized_pool_resource 或同步版本。
相关文章:
- 指针会被解除分配吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 解除分配矩形 2D 数组会根据尺寸产生错误
- 为什么在正确解除分配内存时出现内存泄漏?
- 堆栈变量超出范围时是否解除分配?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在 QStandardItemModel 中解除分配项目
- 解除分配此特定 2D 阵列的内存
- C++删除数组只会解除分配第一项
- 在 c++ 中使用向量解除分配
- 与解除分配堆数组相关的语法混淆
- 解除分配与 C++ 中的结构关联的所有内存
- 是否随作用域分配和解除分配堆栈帧
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 如果清除了 std::map 是否确保内存被解除分配
- 在另一个结构中的结构内解除分配指针
- 为什么在分配/解除分配许多小对象后内存不可重用
- 将分配/解除分配多维数组从 C++ 转换为 C
- 是否有比 boost::object_pool 更快的 C++ 堆分配/解除分配机制
- cpputest错误消息分配/解除分配