C++ 簡單對象池實現

C++ 簡單對象池實現

1、前言

C++內存管理可謂是讓程序員操碎了心,前面寫了C++內存池設計與實現linux

C++智能指針,此次該是你們常常據說的對象池了;ios

什麼是對象池程序員

所謂對象池就是有不少對象的池子,其實也就是開始建立大量的對象放在一個池子裏面;這難免讓我想起了後宮佳麗三千人呀!咱們能夠將後宮比做一個池子,這三千佳麗就是三千個對象,這三千佳麗住在後宮,也就是在對象池中有三千個對象;bash

對象池的做用服務器

咱們還用着後宮佳麗三千人來作比較;微信

第一種狀況:皇帝須要一個妃子就讓侍衛和大臣去納妃,這一次就可能要很久,這些侍衛和大臣難免要面臨砍頭抄家的風險呀!關鍵每次皇帝每次納妃以後,就把妃子逐出了皇宮,這樣每次納妃再逐出去,皇帝心累,侍衛和大臣每次也是在牆角瑟瑟發抖呀!數據結構

**第二種狀況:**這種狀況就好不少了,侍衛和大臣一次性就爲皇帝納了3000人而且入住後宮,皇帝須要妃子的時候,從後宮抓一個出來,不須要在放進去,這樣,侍衛和大臣沒有了砍頭的風險,皇帝也很愉快,效率變高了好多;學習

經過上面兩種說法,咱們會發現,採用對象池的方式,會使對象在申請和釋放時更加的高效和方便;測試

2、對象池實現思路

C++ STL爲咱們提供了大量的數據結構供咱們使用,咱們能夠採用其中某種數據結構就能夠輕鬆的實現對象池ui

採用鏈表的方式:

假設咱們建立了一個對象池中有五個對象;

獲取對象

爲了防止衝突,每次咱們獲取對象的時候,咱們會從鏈表的頭進行獲取,而後將頭刪除

回收對象

與獲取對象相同,回收對象時,將對象加入到對象池的尾部,這樣就不會和獲取對象有所衝突;

此次是作的簡單的對象池,其實有不少缺陷:

  • 對象池中沒有對象時,應該另外申請對象,釋放對象的時候,應該區分直接釋放和回收內存池,可參考 C++內存池設計與實現
  • 釋放回收比較麻煩,並且容易形成內存泄漏;

這些缺陷其實有不少解決辦法,就不一一說了,只是提供思路;

3、對象池實現測試代碼

對象池實現代碼

#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;
}
複製代碼

往期精彩文章

想了解學習更多C++後臺服務器方面的知識,請關注: 微信公衆號:====**CPP後臺服務器開發**====

相關文章
相關標籤/搜索