MemPooling #
메모리 풀링 클래스Efficient C++(Dov Bulka , David Mayhew)에서 많은 도움은 얻음
나름대로 좋은 성능을 냄
나름대로 좋은 성능을 냄
/** * MemPool.h * * Memory Pooling Class * * Copyright (c) 2004 by cdecl (byung-kyu kim) * */ #ifndef __MEM_POOL_H__BY__CDECL #define __MEM_POOL_H__BY__CDECL namespace GLASS { // MemPool Class class MemPool { public: typedef unsigned int size_type; enum { DEFAULT_CHUNK_SIZE = 32 }; struct MemNode { MemNode *next_; }; public: MemPool(size_type type_size, size_type chunk_size = DEFAULT_CHUNK_SIZE) : pHead_(0), pFree_(0), nUsed_(0), TYPESIZE(type_size > sizeof(MemNode*) ? type_size : sizeof(MemNode*)), CHUNK_SIZE(chunk_size) { ExpanseChunk(); }; ~MemPool() { Release(); } public: void* malloc() { if (IsFull()) { if (pFree_) return (NodeNext(pFree_)); ExpanseChunk(); } int nOffSet = sizeof(MemNode*) + (TYPESIZE * nUsed_++); return (reinterpret_cast<char*>(pHead_) + nOffSet); } void free(void *p) { MemNode *pmn = reinterpret_cast<MemNode*>(p); pmn->next_ = pFree_; pFree_ = pmn; } void ExpanseChunk() { size_type nAllocSize = TYPESIZE * CHUNK_SIZE + sizeof(MemNode*); MemNode *pmn = reinterpret_cast<MemNode *>(::operator new(nAllocSize)); nUsed_ = 0;; pmn->next_ = pHead_; pHead_ = pmn; } bool IsFull() const { return nUsed_ >= CHUNK_SIZE; } void Release() { while (pHead_ != 0) { ::operator delete(NodeNext(pHead_)); } } private: inline MemNode* NodeNext(MemNode *&pmn) { MemNode *p = pmn; pmn = pmn->next_; return p; } private: // No Copy MemPool(const MemPool&); MemPool& operator=(const MemPool&); private: MemNode *pHead_; MemNode *pFree_; size_type nUsed_; private: const size_type TYPESIZE; const size_type CHUNK_SIZE; }; } // namespace GLASS #endif
'Dev > C++' 카테고리의 다른 글
C++ 0x - Herb Sutter의 블로그 글 (0) | 2008.07.29 |
---|---|
C++ 0x (0) | 2008.05.09 |
Is Derived - code (0) | 2008.05.01 |
C++에서 프로퍼티 구현하기 (0) | 2008.05.01 |
boost::pool 예제 (0) | 2008.05.01 |