boost.pool如何实现分配内存的复用?

2023-11-24

背景

My 上一个问题 about boost.pool导致我详细研究了boost.pool,现在我有一个补充问题来最终确定我的理解。

Prelude

这个参考有关对象池模式的说明如下:

对象池模式是一种软件创建设计模式, 使用一组随时可用的初始化对象,而不是 根据需要分配和销毁它们。

据我所知,boost.pool(简化)通过主要基于对象大小的内存分配和管理来实现对象池模式element_type,并返回一个指向已分配对象的简单指针:

element_type * malloc();
void free(element_type * p);

一个简单的 boost 示例也表明没有必要显式地free获取的元素:

X * const t = p.malloc();
... // Do something with t; don't take the time to free() it.

Question

我知道分配的内存将在池对象销毁时安全地释放,但是池如何知道客户端获取的内存块何时已释放回池中,并且如果其接口交回直接指针,则该内存块可以重用到element_type,还需要调用free()还是不需要?即,如果无法确定内存是否仍在使用中,Boost 池如何重新使用该内存?如果它不重新使用该内存,这是否被认为与 wiki 参考文献解释的模式相同?


如果无法确定,Boost 池如何重用该内存 内存不是还在使用吗?

不可以。事实上它不会重用该内存。只能保证你不会漏水当池被破坏时.

如果它不重新使用该内存,这是否被认为与 wiki 参考文献解释的模式相同?

The article你链接说:在初始化类实例的成本很高的情况下,对象池可以显着提高性能

而从助推池介绍:池通常用于小对象的大量分配和释放。

所以不,它们不是同一个模式。一种是为了重复使用以下对象昂贵的构造(线程、opengl 资源等)。另一个用于管理大量小对象,为您提供比标准分配器更多的控制权。

正如您所指出的,有两种使用池的方法:

  1. 作为分配器,在适当的时候调用 malloc()/free()。这是池分配器的基本用法,它有助于减少内存碎片
  2. 构造大量临时对象并且不用费心删除它们。

第二种情况的示例:假设您有一个图类,其中每个节点使用指针存储其邻居。现在您必须对图表进行深层复制。您将分配一堆新节点并将数据从旧节点复制到新节点,但现在您必须初始化邻居指针,因此您需要一个从旧指针到新指针的映射:

std::map<node*,node*> old_ptr_to_new_ptr;

这是一个很好的例子,其中池分配器很有用(我不会详细介绍如何将池分配器与 std 容器一起使用):许多小对象(映射节点)将被一起删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost.pool如何实现分配内存的复用? 的相关文章

随机推荐

  • C 函数调用中的默认参数提升

    Setup 我对在 C 中调用函数时的默认参数提升有几个问题 这是第 6 5 2 2 节 函数调用 第 6 7 和 8 段C99 标准 pdf 为了便于阅读 添加了重点并分成列表 第 6 段 如果表示被调用函数的表达式的类型为不包括原型 对
  • Double 到 String 保持尾随零

    我尝试将双精度值转换为字符串并使用Replace 方法 将 替换为 这很好用 但只有当尾随数字不为零时 我的字符串中才需要零 即使该值为 1234 0 0 这对于十进制值效果很好 我尝试将双精度数转换为十进制数 但如果有零 我会丢失小数位
  • 调用 CallVoidMethod 时 JNI 崩溃

    我正在尝试从 Android 应用程序中的本机 C 代码调用 java 方法 使用 JNI 听起来很简单 但我的代码在最终调用方法本身时总是崩溃 这是我的代码 本机 C 代码 JNIEXPORT void JNICALL Java com
  • 如何更改 XAMPP 中 PHP 的默认路径?

    我正在使用 xampp 来部署 Web 应用程序 它将 PHP 模块包含在一个包中 现在我想做的是更改 PHP 的默认路径 以便我可以使用其他版本的 PHP 而无需覆盖现有模块 我的新 PHP 副本存在于桌面上 如何配置 Apache 以引
  • 将 JPanel 上的组件置于前面 (Java)

    在VB中 您可以使用zOrder 在 Net中 它是 SetChildIndex 在你问之前 不 在这种情况下我没有使用布局管理器 如果您有两个叠在一起的组件 那么在它们已经显示之后如何更改顺序 由于空间不足 我有一个按钮稍微重叠在另一个组
  • 与 Windows 10 相比,Android 模拟器在 ubuntu 17.04 上运行速度极慢

    我尝试从此链接安装 kvm https help ubuntu com community KVM Installation 但即使在尝试此操作之后 模拟器在软件 GLES 2 0 模式下运行时仍然很慢 并且当我选择硬件 GLES 2 0
  • (默认)为每个可变参数类型构造一个对象

    考虑这个代码片段 void Foo std string str1 std string str2 template
  • IE10 setInterval 内存泄漏的解决方法

    在测试我们的 Javascript 库期间 我认为我们在 IE10 v10 0 9200 16519 Windows 8 64 位 Javascript 实现中发现了严重的内存泄漏setInterval 一个简单的测试用例表明 如果在函数的
  • SQL - 源代码控制和架构/脚本管理

    我的公司刚刚完成年度审核流程 我终于说服他们 是时候找到更好的解决方案来管理我们的 SQL 模式 脚本了 目前 我们只有几个脚本需要手动更新 我曾在另一家公司使用过 VS2008 数据库版本 这是一个很棒的产品 我的老板让我看一下 Redg
  • “git submodule foreach git pull origin master”和“git pull origin master --recurse-submodules”有什么区别

    我有一个 dotfiles 存储库 其中所有 vim 插件都存储为子模块 因此在发生更改时很容易更新 我以为这两个命令做了同样的事情 但我注意到事实并非如此 我知道我有几个子模块需要更新 所以我跑了git pull origin maste
  • 进行定点数学运算的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我需要为没有 FPU 的
  • 检测 iOS 上的飞行模式

    如何检测手机是否处于飞行模式 仅仅检测没有互联网连接是不够的 我必须能够区分这两种情况 尝试使用SCNetworkReachabilityGetFlags 系统配置框架 如果传回的flags变量为0且返回值为YES 则飞行模式开启 看看苹果
  • 简单的 shell 解决方案,用于为 stdout 的每一行执行命令[重复]

    这个问题在这里已经有答案了 这应该是一个非常简单的任务 我想获取任何旧命令的标准输出的每一行 并使用每个行来执行另一个命令并将其作为参数 例如 LS grep foo applycommand mv s bar 这将需要所有匹配的东西 fo
  • 将位图数组转换为 YUV (YCbCr NV21)

    如何转换返回的BitmapBitmapFactory decodeFile 转换为 YUV 格式 类似于相机 onPreviewFrame 以字节数组返回的形式 这是一些实际有效的代码 untested function byte getN
  • .net 应用程序图标存储在哪里?

    我试图找出我的应用程序的图标存储在 VS 2008 中的位置 在启动项目的应用程序属性中 我添加了一个带有 使用默认设置嵌入清单 设置的图标 我想以编程方式在应用程序中显示图标 但我无法弄清楚图标的存储位置 如何从代码中获取对应用程序图标的
  • 在 Angular 2 中指定服务提供者

    我正在尝试使用 Angular 2 的 DI 系统来自动处理我的服务的依赖项 我想在服务本身上使用注释 而不是使用第二个参数bootstrap 指定所有可注入服务 我有什么 低级服务 services role store ts expor
  • 角度路线包含#!在 url 中而不是 # [重复]

    这个问题在这里已经有答案了 最近我注意到 当使用ngRouteAngularJS 应用程序中的模块 该路由包含 在 URL 中 之前只是 例如 www webiste com login变成www website com login 我必须
  • 无法使用 JavaMail 在 Office365 上对 IMAP 进行身份验证

    我们正在尝试使用 OAUTH2 身份验证将 javamail 1 6 客户端连接到托管在 Office365 上的 Office365 邮箱 无论我们做什么 我们都会不断收到 A1 NO AUTHENTICATE failed 我们已经注册
  • 向文本块添加逐渐增加的模糊效果

    我有这样的文字 div p Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolor
  • boost.pool如何实现分配内存的复用?

    背景 My 上一个问题 about boost pool导致我详细研究了boost pool 现在我有一个补充问题来最终确定我的理解 Prelude 这个参考有关对象池模式的说明如下 对象池模式是一种软件创建设计模式 使用一组随时可用的初始