참고링크 [Bottom] [Top]

참고도서 [Bottom] [Top]

TPool Template [Bottom] [Top]

   1 // TPool.h : TPool 템플릿 선언
   2 //
   3 
   4 #pragma once
   5 
   6 
   7 // 템플릿 선언
   8 template< typename T, int DEFAULT_BLOCK_COUNT = 64 >
   9 class TPool
  10 {
  11 public:
  12         void * operator new( size_t stAllocSize )
  13         {
  14                 if( NULL == s_pFreeChunks )
  15                 {
  16                         // Chunk Memory 할당/초기화
  17                         AllocChunks();
  18                 }
  19 
  20                 void * ptrMem = reinterpret_cast<char *>(s_pFreeChunks)
  21                         + sizeof(void *);
  22 
  23                 s_pFreeChunks = *(reinterpret_cast<char **>(s_pFreeChunks));
  24 
  25                 return ptrMem;
  26         }
  27 
  28         static void operator delete( void * pMemory )
  29         {
  30                 void * ptrMem = reinterpret_cast<char *>(pMemory)
  31                         - sizeof(void *);
  32 
  33                 // Chunk 반환
  34                 *(reinterpret_cast<void **>(ptrMem)) = s_pFreeChunks;
  35                 s_pFreeChunks = ptrMem;
  36         }
  37 
  38 private:
  39         static void AllocChunks()
  40         {
  41                 // Chunk 크기 계산
  42                 const int CHUNK_SIZE = (((sizeof(T) + (sizeof(void*) - 1))
  43                         / sizeof(void*)) * sizeof(void*)) + sizeof(void*);
  44 
  45                 // Memory 할당
  46                 s_pFreeChunks = new char[ CHUNK_SIZE * DEFAULT_BLOCK_COUNT ];
  47 
  48                 // Chunk 링크 연결
  49                 char ** ppCurrent = reinterpret_cast<char **>(s_pFreeChunks);
  50                 char *  pNext     = reinterpret_cast<char *>(s_pFreeChunks);
  51 
  52                 for( int i=0; i<(DEFAULT_BLOCK_COUNT-1); ++i )
  53                 {
  54                         pNext      += CHUNK_SIZE;
  55                         *ppCurrent =  pNext;
  56                         ppCurrent  =  reinterpret_cast<char **>(pNext);
  57                 }
  58 
  59                 // 마지막 Chunk 링크 설정
  60                 *ppCurrent = NULL;
  61         }
  62 
  63 private:
  64         static void * s_pFreeChunks;
  65 };
  66 
  67 
  68 template< typename T, int DEFAULT_BLOCK_COUNT >
  69 void * TPool< T, DEFAULT_BLOCK_COUNT>::s_pFreeChunks = NULL;

추가 사항 [Bottom] [Top]

  1. 메모리 할당만 가능하기 때문에 메모리 해제 기능의 구현이 필요하다.
  2. 추가로 계속 할당될 경우 메모리를 관리해주는 메모리 관리자가 필요하다.

Template/Pool (last edited 2007-06-08 10:33:26 by viper)