Реализация простого пула объектов C++
Введение
Можно сказать, что управление памятью в 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;
}
Замечательные статьи в прошлом
Чтобы узнать больше о фоновых серверах C++, выполните следующие действия:
Публичный аккаунт WeChat: ====**CPP后台服务器开发**
====