看完了c++设计新思维中的内存池实现,再粗略看下boost中pool的实现。可以看出两者有些相似之处。
查看罗剑锋的boost程序库完全开发指南会发现对内存池pool讲解甚是简单
没有标明任何注意事项,认为使用简单,随便使用,其实里面有很多使用不当,反而会效果更差
boost中有如下几个类型的pool,object_pool,singleton_pool
我们一个一个来进行解析
poolfwd.hpp中有如下几个申明,保证了pool使用时不用指定模板参数
template <typename UserAllocator = default_user_allocator_new_delete>
class pool;
template <typename T, typename UserAllocator = default_user_allocator_new_delete>
class object_pool;
template <typename Tag, unsigned RequestedSize,
typename UserAllocator = default_user_allocator_new_delete,
typename Mutex = details::pool::default_mutex,
unsigned NextSize = 32,
unsigned MaxSize = 0>
struct singleton_pool;
//
先看pool的实现
而在pool.hpp中,如果没看到前面的pool前置申明,会想不明白,为什么pool可以不指定模板参数的
template <typename UserAllocator>
class pool: protected simple_segregated_storage<
typename UserAllocator::size_type>
构造函数指定的几个参数
explicit pool(const size_type nrequested_size,
const size_type nnext_size = 32,
const size_type nmax_size = 0)
默认情况下我们会指定第一个参数,即每次分配的大小(malloc分配的大小)
其实另外两个参数也是有含义的,以下是三个参数的含义
requested_size:需要外部传入
next_size, 默认为32
start_size:默认就是next_size
max_size:默认为0
比如我们设置pool的requestsize是32byte,那么它默认会为我们分配
next_size * requestsize这么一块大的内存,分配完后,会把next_size左移1位,就是变为了64.
当next_size * 32这么一块大的内存都被用完了,它就认为32太小,