C++ ';标签';boost::pool_分配器和boost::fast_pool_分配器中的模板参数是否支持控制基础池的实例?
更新:问题在我第一次编写时不再适用,因此我修改了问题的标题该问题现在应询问是否修改C++ ';标签';boost::pool_分配器和boost::fast_pool_分配器中的模板参数是否支持控制基础池的实例?,c++,boost,pool,allocator,C++,Boost,Pool,Allocator,更新:问题在我第一次编写时不再适用,因此我修改了问题的标题该问题现在应询问是否修改pool\u分配器或boost\u pool\u分配器以接受一个标记参数,该参数控制所用基础池的选择(如问题中所述)这是一个好主意——或者这是否可以在不修改库的情况下实现——如果没有其他方法的话,这对Boost.Pool是否有用 对于一个项目,我非常依赖Boost.Pool(因为对于数以百万计的不再使用的小对象来说,标准内存释放需要非常非常长的时间(~30分钟) (关于我在编写本项目时发布的另外两个问题,请参见和
pool\u分配器
或boost\u pool\u分配器
以接受一个标记
参数,该参数控制所用基础池的选择(如问题中所述)这是一个好主意——或者这是否可以在不修改库的情况下实现——如果没有其他方法的话,这对Boost.Pool是否有用
对于一个项目,我非常依赖Boost.Pool(因为对于数以百万计的不再使用的小对象来说,标准内存释放需要非常非常长的时间(~30分钟) (关于我在编写本项目时发布的另外两个问题,请参见和,这两个问题与Boost Pool有关。) 我的场景是:我有许多不同的池,通常存储相同大小的对象,需要在非常不同的时间释放它们。为了实现这一点,我利用
boost::fast\u pool\u allocator
中的Tag
模板参数来控制池(特别是何时删除哪个池)
例如,我的代码(在使用不同标记的Boost池的许多其他用途中)有一行-请注意末尾附近的自定义分配器(aBoost::fast\u Pool\u分配器
):
经过很多努力,定义了至少20种不同的池类型,我的内存问题得到了解决,我继续前进
这就是Boost.Pool 1.55版
在Boost.Pool 1.56版中,我惊讶地看到,Pool\u分配器
和fast\u Pool\u分配器
的标记
参数已被删除
以下是两个版本:
第1.55版:
// boost::pool_allocator, version 1.55
template <typename T,
typename UserAllocator,
typename Tag, // <-- This was removed in version 1.56: How to distinguish pools?
typename Mutex,
unsigned NextSize,
unsigned MaxSize >
class pool_allocator {...}
//boost::pool\u分配器,版本1.55
template我假设标记模板参数被透明地“转发”到底层池
标记类型仍然存在,但不是公共接口的一部分。例如:
const pointer ret=static\u cast(
singleton_pool::ordered_malloc(n))代码>
因此,您可以(再次:)修改代码,将自己的标记传递给基础池,而不是硬编码pool\u allocator\u tag
和fast\u pool\u allocator\u tag
我建议您将更改保留为补丁,以便更容易跟上上游更改。你可以在图书馆的git@github.com:boostorg/pool.git,这样您就可以git-rebase
更改。据我所知,也没有标记
模板参数。你确定你不是在看某种定制的修改吗?@T.C.你说得对!天哪,我忘了我只是为了这个目的修改了课程。明天,我将更新这个问题来说明这一点,也可能会问,这是否是对类的修改类型,可能是需要的-我当然需要它!向所有花时间回答这个问题的人道歉。我已经更新了问题的标题,并在问题的开头添加了一个更新,以表明这一点。@DanNissenbaum:关闭这个问题可能更好,因为它从来都是无效的,然后建议您修改Boost邮件列表或bug跟踪器(甚至可能在这里作为一个新问题)@JohnZwinck我考虑过关闭它,但我认为可能其他人在使用pool\u分配器
或fast\u pool\u分配器
时会遇到无法控制池的问题,并且可能会遇到这个问题——显然,修改轻量级pool\u alloc.hpp
文件以通过所需的标签,以便启用此功能-我并不疯狂地想知道这一点。:)所以我想我会让它保持打开状态,只需更改标题并在问题的顶部添加更新。从未想过克隆Boost存储库(即使我以前从未对其进行过更改)。好主意,我会的!
// Here is the 'tag' type used in the above line of code
// ... this distinguishes the pool used
struct newgene_cpp_int_tag
{};
// boost::pool_allocator, version 1.55
template <typename T,
typename UserAllocator,
typename Tag, // <-- This was removed in version 1.56: How to distinguish pools?
typename Mutex,
unsigned NextSize,
unsigned MaxSize >
class pool_allocator {...}
// boost::pool_allocator, version 1.56
template <typename T,
typename UserAllocator,
typename Mutex,
unsigned NextSize,
unsigned MaxSize >
class pool_allocator {...}