C++內存管理可謂是讓程序員操碎了心,前面寫了C++內存池設計與實現和linux
C++智能指針,此次該是你們常常據說的對象池了;ios
什麼是對象池程序員
所謂對象池就是有不少對象的池子,其實也就是開始建立大量的對象放在一個池子裏面;這難免讓我想起了後宮佳麗三千人呀!咱們能夠將後宮比做一個池子,這三千佳麗就是三千個對象,這三千佳麗住在後宮,也就是在對象池中有三千個對象;bash
對象池的做用服務器
咱們還用着後宮佳麗三千人來作比較;微信
第一種狀況:皇帝須要一個妃子就讓侍衛和大臣去納妃,這一次就可能要很久,這些侍衛和大臣難免要面臨砍頭抄家的風險呀!關鍵每次皇帝每次納妃以後,就把妃子逐出了皇宮,這樣每次納妃再逐出去,皇帝心累,侍衛和大臣每次也是在牆角瑟瑟發抖呀!數據結構
**第二種狀況:**這種狀況就好不少了,侍衛和大臣一次性就爲皇帝納了3000人而且入住後宮,皇帝須要妃子的時候,從後宮抓一個出來,不須要在放進去,這樣,侍衛和大臣沒有了砍頭的風險,皇帝也很愉快,效率變高了好多;學習
經過上面兩種說法,咱們會發現,採用對象池的方式,會使對象在申請和釋放時更加的高效和方便;測試
C++ STL
爲咱們提供了大量的數據結構供咱們使用,咱們能夠採用其中某種數據結構就能夠輕鬆的實現對象池ui
採用鏈表的方式:
假設咱們建立了一個對象池中有五個對象;
獲取對象
爲了防止衝突,每次咱們獲取對象的時候,咱們會從鏈表的頭進行獲取,而後將頭刪除
回收對象
與獲取對象相同,回收對象時,將對象加入到對象池的尾部,這樣就不會和獲取對象有所衝突;
此次是作的簡單的對象池,其實有不少缺陷:
這些缺陷其實有不少解決辦法,就不一一說了,只是提供思路;
對象池實現代碼
#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後臺服務器開發**
====