资讯首页 新闻资讯 云计算测评 云服务商动态 技术频道
上云无忧 > 云计算资讯  > 技术频道 > C++ 简单对象池实现

C++ 简单对象池实现

发布时间: 2020-05-23 21:17:39|浏览量:334| 评论: 0

一、前言


C++内存管理可谓是让程序员操碎了心,前面写了C++内存池设计与实现和

 

C++智能指针,这次该是大家经常听说的对象池了;

 

什么是对象池

 

所谓对象池就是有很多对象的池子,其实也就是开始创建大量的对象放在一个池子里面;这不免让我想起了后宫佳丽三千人呀!我们可以将后宫比作一个池子,这三千佳丽就是三千个对象,这三千佳丽住在后宫,也就是在对象池中有三千个对象;

 

对象池的作用

 

我们还用着后宫佳丽三千人来做比较;

 

第一种情况:皇帝需要一个妃子就让侍卫和大臣去纳妃,这一次就可能要好久,这些侍卫和大臣不免要面临砍头抄家的风险呀!关键每次皇帝每次纳妃之后,就把妃子逐出了皇宫,这样每次纳妃再逐出去,皇帝心累,侍卫和大臣每次也是在墙角瑟瑟发抖呀!

 

**第二种情况:**这种情况就好很多了,侍卫和大臣一次性就为皇帝纳了3000人并且入住后宫,皇帝需要妃子的时候,从后宫抓一个出来,不需要在放进去,这样,侍卫和大臣没有了砍头的风险,皇帝也很愉快,效率变高了好多;

 

通过上面两种说法,我们会发现,采用对象池的方式,会使对象在申请和释放时更加的高效和方便;

 

二、对象池实现思路


C++ STL为我们提供了大量的数据结构供我们使用,我们可以采用其中某种数据结构就可以轻松的实现对象池

 

采用链表的方式:

 


假设我们创建了一个对象池中有五个对象;

 

获取对象

 

为了防止冲突,每次我们获取对象的时候,我们会从链表的头进行获取,然后将头删除

 

回收对象

 

与获取对象相同,回收对象时,将对象加入到对象池的尾部,这样就不会和获取对象有所冲突;

 

这次是做的简单的对象池,其实有很多缺陷:

 

对象池中没有对象时,应该另外申请对象,释放对象的时候,应该区分直接释放和回收内存池,可参考C++内存池设计与实现;


释放回收比较麻烦,而且容易造成内存泄漏;


这些缺陷其实有很多解决办法,就不一一说了,只是提供思路;

 

三、对象池实现测试代码


对象池实现代码

 

#ifndef _OBJECTPOOL_HPP_
#define _OBJECTPOOL_HPP_

#include <iostream>
#include <list>

template<class Object>
class ObjectPool
{
public:
 ObjectPool(size_t Size)
 {
  _nSize = Size;
  for (size_t n = 0; n < _nSize; n++)
  {
   _mPool.push_back(new Object());
  }
 }
 virtual ~ObjectPool()
 {
  auto iter = _mPool.begin();
  while (iter != _mPool.end())
  {
   delete *iter;
   ++iter;
  }
  _nSize = 0;
 }

 Object* GetObject()
 {
  Object* pObj = NULL;
  if (_nSize == 0)
  {
   pObj = new Object();
  }
  else
  {
   pObj = _mPool.front();
   _mPool.pop_front();
   --_nSize;
  }
  return pObj;
 }

 void ReturnObject(Object* pObj)
 {
  _mPool.push_back(pObj);
  ++_nSize;
 }

private:
 size_t _nSize;
 std::list<Object*> _mPool;
};

#endif // !_OBJECTPOOL_HPP_

 

对象池测试代码

 

#include "ObjectPool.hpp"

using namespace std;

class Test
{
public:
 Test() {}
 ~Test() {}
 void Print()
 {
  cout << "Test" << endl;
 }
};

int main()
{
 ObjectPool<Test> obj(10);
 Test* pA;
 pA = obj.GetObject();
 pA->Print();
 obj.ReturnObject(pA);

 return 0;
}

更多【技术频道】相关文章

有话要说

全部评论

暂无评论
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部