참고링크 [Bottom] [Top]
Pool Concepts - http://www.boost.org/libs/pool/doc/concepts.html
참고도서 [Bottom] [Top]
- 온라인 게임 서버 프로그래밍
- 한동훈 저, 정보문화사
ISBN: 8956743495
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]
- 메모리 할당만 가능하기 때문에 메모리 해제 기능의 구현이 필요하다.
- 추가로 계속 할당될 경우 메모리를 관리해주는 메모리 관리자가 필요하다.
