zoukankan      html  css  js  c++  java
  • C++对象池技术剖析

    对象池就是一定数量已经创建好的对象的集合。

    可以事先创建一批对象,放在一个链表中,以后每当程序要新的对象时,都从对象池中获取,每当程序用完该对象后,都把该对象归还给对象池。这样就少了很多的malloc/free操作,在一定程度上提高了系统的性能,尤其在动态内存分配比较频繁的程序中效果尤其明显。

    对象池的特征:

    1、对象池中有一定数量创建好的对象。

    2、对象池向用户提供获取对象的接口和归还对象的接口。

    下面是参考网上的资料写的实现代码:

    #include<list>
    #include<iostream>
    using namespace std;
    
    template<class T>
    class ObjectPool
    {
    	list<void *> data_list;
    public:
    	void *malloc_data()
    	{
    		if(!data_list.empty())
    		{
    			list<void *>::iterator it=data_list.begin();
    			void *p=*it;
    			data_list.pop_front();
    			return p;
    		}
    		else
    		{
    			void *p=malloc(sizeof(T));
    			return p;
    		}
    	}
    	void free_data(void *p)
    	{
    		data_list.push_back(p);
    	}
    };
    class Object{
    public:
    	int value;
    	Object(int a):value(a){cout<<"Object("<<a<<")called"<<endl;}
    	~Object(){cout<<"~Object("<<value<<")called"<<endl;}
    
    	static ObjectPool<Object> pool_;
    	void *operator new(size_t size)
    	{
    		return pool_.malloc_data();
    	}
    	void operator delete(void *p)
    	{
    		pool_.free_data(p);
    	}
    };
    

    测试程序:

    ObjectPool<Object> Object::pool_;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Object* o1=new Object(1);
    	Object* o2=new Object(2);
    	delete o1;
    	delete o2;
    
    	return 0;
    }
    

    上述代码,实现了一个简单的对象池,更深入的解释会在后续代码中实现。

  • 相关阅读:
    [转]解决百度统计 gzdecode(): insufficient memory
    排序二叉树生成
    非递归后序遍历二叉树(1)
    排序方法总结(一)
    匿名自执行函数
    php 判断图片类型
    根据文件的修改日期筛选出目标文件
    js中document的用法小结
    python生成器
    爬虫学习(十九)——Scrapy的学习及其使用
  • 原文地址:https://www.cnblogs.com/fistao/p/3011005.html
Copyright © 2011-2022 走看看