単純C++オブジェクトプール実装
2084 ワード
/ *ObjectPool.h */
#include <iostream>
#include <queue>
#include <vector>
template <typename T>
class ObjectPool
{
public:
ObjectPool(size_t chunk_size = kdefault_size);
~ObjectPool();
T& acquire_object();
void release_object(T& obj);
protected:
void allocate_chunk();
static void array_delete_object(T* obj);
private:
std::queue<T*> free_list_;
std::vector<T*> all_objects_;
int chunk_size_; //
static const size_t kdefault_size = 100; //
ObjectPool(const ObjectPool<T>& src);
ObjectPool<T>& operator=(const ObjectPool<T>& rhs);
};
/* ObjectPool.cpp */
#include "ObjectPool.h"
#include <algorithm>
template <typename T>
const size_t ObjectPool<T>::kdefault_size;
template <typename T>
ObjectPool<T>::ObjectPool(size_t chunk_size /* = kdefault_size */) : chunk_size_ (chunk_size)
{
if (chunk_size_ <= 0)
{
std::cout << "Object size invalid" << std::endl;
}
else
{
allocate_chunk();
}
}
template <typename T>
void ObjectPool<T>::array_delete_object(T* obj)
{
delete obj;
}
template <typename T>
ObjectPool<T>::~ObjectPool()
{
std::for_each(all_objects_.begin(), all_objects_.end(), ObjectPool<T>::array_delete_object);
}
template <typename T>
void ObjectPool<T>::allocate_chunk()
{
T* new_objects = new T(chunk_size_);
for (int i = 0; i < chunk_size_; ++i)
{
all_objects_.push_back(&new_objects[i]);
free_list_.push(&new_objects[i]);
}
}
template <typename T>
T& ObjectPool<T>::acquire_object()
{
if (free_list_.empty())
{
allocate_chunk();
}
T *obj = free_list_.front();
free_list_.pop();
return (*obj);
}
template <typename T>
void ObjectPool<T>::release_object(T& obj)
{
free_list_.push(&obj);
}
『Professional C++』より