背景
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 资源等)。另一个用于管理大量小对象,为您提供比标准分配器更多的控制权。
正如您所指出的,有两种使用池的方法:
- 作为分配器,在适当的时候调用 malloc()/free()。这是池分配器的基本用法,它有助于减少内存碎片
- 构造大量临时对象并且不用费心删除它们。
第二种情况的示例:假设您有一个图类,其中每个节点使用指针存储其邻居。现在您必须对图表进行深层复制。您将分配一堆新节点并将数据从旧节点复制到新节点,但现在您必须初始化邻居指针,因此您需要一个从旧指针到新指针的映射:
std::map<node*,node*> old_ptr_to_new_ptr;
这是一个很好的例子,其中池分配器很有用(我不会详细介绍如何将池分配器与 std 容器一起使用):许多小对象(映射节点)将被一起删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)