3
|
1 #ifndef MEMORY_POOL_H_
|
|
2 #define MEMORY_POOL_H_
|
|
3
|
|
4 #include <memory>
|
|
5 #include <stdlib.h>
|
|
6
|
|
7 const int DEFAULT_EXPAND_SIZE = 32;
|
|
8
|
|
9 template <class T_, size_t size_ =DEFAULT_EXPAND_SIZE>
|
|
10 class MemoryPool {
|
|
11 public:
|
|
12 typedef MemoryPool<T_, size_> self_type;
|
|
13
|
|
14 MemoryPool(void) {
|
|
15 next_ = NULL;
|
|
16 expandTheFreeList(size_);
|
|
17 }
|
|
18
|
|
19 ~MemoryPool(void) {
|
|
20 MemoryPool * nextPtr = next_;
|
|
21
|
|
22 while (nextPtr == 0) {
|
|
23 next_ = next_->next_;
|
|
24 delete [] nextPtr;
|
|
25 nextPtr = next_;
|
|
26 }
|
|
27 }
|
|
28
|
|
29 void* alloc(size_t) {
|
|
30 if (!next_) expandTheFreeList(size_);
|
|
31
|
|
32 self_type* head = next_;
|
|
33 next_ = head->next_;
|
|
34
|
|
35 return head;
|
|
36 }
|
|
37
|
|
38 void free(void* doomed) {
|
|
39 self_type* head = static_cast<self_type*>(doomed);
|
|
40 head->next_ = next_;
|
|
41 next_ = head;
|
|
42 }
|
|
43
|
|
44 private:
|
|
45 void expandTheFreeList(int howMany);
|
|
46
|
|
47 private:
|
|
48 self_type* next_;
|
|
49 };
|
|
50
|
|
51 template <class T_, size_t size_>
|
|
52 void MemoryPool<T_, size_>::expandTheFreeList(int howMany)
|
|
53 {
|
|
54 size_t size = (sizeof(T_) > sizeof(self_type*))
|
|
55 ? sizeof(T_) : sizeof(self_type*);
|
|
56
|
|
57 self_type* runner = (self_type*)malloc(size);
|
|
58
|
|
59 next_ = runner;
|
|
60 for (int i = 0; i < howMany; i++) {
|
|
61 runner->next_ = (self_type*)malloc(size);
|
|
62 runner = runner->next_;
|
|
63 }
|
|
64 runner->next_ = 0;
|
|
65 }
|
|
66
|
|
67 template <class T_, size_t size_ =DEFAULT_EXPAND_SIZE>
|
|
68 class UseMemoryPool {
|
|
69 public:
|
|
70 void* operator new(size_t size) { return pool_->alloc(size); }
|
|
71 void operator delete(void* doomed, size_t) { pool_->free(doomed); }
|
|
72
|
|
73 public:
|
|
74 static void initMemPool() {
|
|
75 pool_.reset(new MemoryPool<T_, size_>);
|
|
76 }
|
|
77
|
|
78 private:
|
|
79 static std::auto_ptr<MemoryPool<T_, size_> > pool_;
|
|
80
|
|
81 };
|
|
82
|
|
83 template <class T_, size_t size_>
|
|
84 std::auto_ptr<MemoryPool<T_, size_> > UseMemoryPool<T_, size_>::pool_;
|
|
85
|
|
86 #endif // ! MEMORY_POOL_H_
|