1.内存池是预先分配一块大的内存空间,然后可以再其中使用某种算法实现高效快速的自定制内存分配。内存池能够管理大量的对象,而且在需要大量地分配/释放小对象时很有效率,完全不用考虑delete,它近似于一个小型的垃圾回收机制。
一、pool类
pool类是一个可以返回POD的内存指针。位置:#include <boost/pool/pool.hpp>
类摘要:
template <typename UserAllocator = default_user_allocator_new_delete>
class pool
{
private:
pool(const pool &);
void operator=(const pool &);
public:
explicit pool(size_type requested_size);//构造函数接受一个size_type类型的整数,表示分配内存块的大小(不是pool的大小)
~pool();
bool release_memory();
bool purge_memory();m
bool is_from(void * chunk) const;
size_type get_requested_size() const;
void * malloc();
void * ordered_malloc();
void * ordered_malloc(size_type n);
void free(void * chunk);
void ordered_free(void * chunk);
void free(void * chunks, size_type n);
void ordered_free(void * chunks, size_type n);
};
int main()
{
pool<> p1(sizeof(int));//设定每次分配的大小为int大小。
int *p = (int*)p1.malloc();//内存分配函数。用void*返回。
p1.free(p);//规划内存给内存池。
p1.is_from(p); //测试是否是从该pool中分配出去的。
p1.ordered_malloc(10);//连续分配n块内存。
}
2.(最有用的)
object_pool是用于类实例对象的内存池,与pool类似,但是析构时对所有分配的内存块调用析构函数。但是它的特殊之处在于:construct()和destroy()函数,construct()有多个参数的重载形式,它调用malloc()分配内存,然后在内存池中出入参数调用类的构造函数,返回的是一个已经初始化的对象的指针,destory()则先调用对象的析构函数,然后再用free()释放内存块。
位置:#include <boost/pool/object_pool.hpp>
template <typename ElementType, typename UserAllocator = default_user_allocator_new_delete>
class object_pool
{
public:
object_pool();
~object_pool();
element_type * malloc();
void free(element_type * p);
bool is_from(element_type * p) const;
element_type * construct();
// other construct() functions
void destroy(element_type * p);
};类似pool的用法。
#include <iostream> #include <boost/smart_ptr.hpp> #include <boost/pool/pool.hpp> #include <boost/pool/object_pool.hpp> using namespace boost; using std::cout; using std::endl; using std::string; class test { public: int a, b, c; test(int a1=1, int b1=2, int c1=3) : a(a1), b(b1), c(c1){} void display() { cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; } ~test() { cout<<"test, destory()"<<endl; } }; int main() { object_pool<test> p1; test *p = p1.malloc(); p->a = 11, p->b = 22, p->c = 33; p->display();//11 22 33 test *t = p1.construct(7, 8, 9);//调用构造函数构造一个初始化的对象。 t->display();//7 8 9 p1.destroy(p);//先调用析构函数,然后free内存返回给pool。 }