Реализация простого пула объектов C++

C++

Реализация простого пула объектов 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后台服务器开发**====