码迷,mamicode.com
首页 > 其他好文 > 详细

boost库学习之 pool库

时间:2015-01-30 21:08:32      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:boost   pool   

简单来说内存池预先分配了一块大的内存空间,然后在其中使用某种算法高效快速的自定制内存分配。
pool库包含四个组成部分,最简单的pool,分配类实例的object pool,单件内存池singleton_tool和用于标准库的pool_alloc.
为了使用pool组件,需要包含<boost/pool/pool.hpp>头文件。
操作函数:
pool的构造函数接受一个size_type类型的整数request_size,指示每次pool分配内存块的大小
成员函数get_request_size()获得request_size值
析构时,pool将自动释放它所持有的所有内存。
malloc()从内存池中任意分配一个内存块,类似C中的malloc().返回指向内存的void*指针,失败返回0.
ordered_malloc(),malloc时从内存池中任意分配一个内存块,而order_malloc()则在分配的同时合并空闲块链表.
free(),与malloc相对应,手动释放之前申请的内存(这些内存必须是从这个内存池中申请的),通常情况下内存池会自动管理内存分配,不必调用free(), 除非你认为内存池的空间已经不足。
is_from()测试是否是从这个内存池中分配出去的,返回一个bool值.
release_memory(),让内存池释放所有未被分配的内存,已分配的内存块不受影响。
purge_memory(),则强制释放pool持有的所有内存,不管内存是否被分配。
e.g
	pool<> p1(sizeof(TestClass));
	cout << p1.get_requested_size() << endl;
	TestClass *p = (TestClass*)p1.malloc();
	
	if (p == nullptr) {
		cout << "p == nullptr" << endl;
		return;
	}

	if (p1.is_from(p)) {
		cout << "p is form p1" << endl;
	}

	p1.free(p);


object_pool
object_pool是用于类实例的内存池,与pool类似,object_pool中也可使用malloc()、free()、is_from()等函数,但不会调用构造函数和析构函数。因此,object_pool提供了construct()和destroy()函数。
需要包含<boost/pool/object_pool.hpp>头文件
同样引用boost命名空间
e.g
class TestClass
{
public:
	TestClass(int data){ cout << "TestClass()" << endl; }
	~TestClass(){ cout << "~TestClass()" << endl; }
private:
	int data;
};

void func()
{
	object_pool<TestClass> p1;
	TestClass *tc1 = p1.construct(1); //调用TestClass的构造函数

} //p1自动释放内存,会调用TestClass的析构函数


boost库学习之 pool库

标签:boost   pool   

原文地址:http://blog.csdn.net/aspnet_lyc/article/details/43313447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!