1。概念(见于Baidu) 

内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。

 内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
2.Bullet内存池(btPoolAllocator.h )
   内存池可以是反复的new delete更有效率,而且很有效的避免了内存碎片。btPoocclAllocator提供了一个简单的内存池,包括初始化分配足够数量的内存,申请内存等常用的方法。这个内存池比较好用于反复分配释放同一个对象,初始化了N*size(object)大小的内存,每次分配大小是一个Object。
 1 class btPoocclAllocator
2 {
3 int m_elemSize; //每个对象的大小
4 int m_maxElements;//最大容量
5 int m_freeCount;//剩余的个数
6 void* m_firstFree;//每次分配的起点
7 unsigned char* m_pool; //内存池
8
9 public:
10
11 btPoolAllocator(int elemSize, int maxElements)
12 :m_elemSize(elemSize),
13 m_maxElements(maxElements)
14 {
15 m_pool = (unsigned char*) btAlignedAlloc( static_cast<unsigned int>(m_elemSize*m_maxElements),16);
16
17 unsigned char* p = m_pool;
18 m_firstFree = p;
19 m_freeCount = m_maxElements;
20 int count = m_maxElements;
  //这里相当于每个起始指针记录了下一个分配点的地址,每次分配或者释放的时候,只需更改这些地址
21 while (--count) {
22 *(void**)p = (p + m_elemSize);
23 p += m_elemSize;
24 }
25 *(void**)p = 0;
26 }
27
28 ~btPoolAllocator()
29 {
30 btAlignedFree( m_pool);
31 }
32
33 int getFreeCount() const
34 {
35 return m_freeCount;
36 }
37
38 int getUsedCount() const
39 {
40 return m_maxElements - m_freeCount;
41 }
42
43 int getMaxCount() const
44 {
45 return m_maxElements;
46 }
47
48 void* allocate(int size)
49 {
50 // release mode fix
51 (void)size;
52 btAssert(!size || size<=m_elemSize);
53 btAssert(m_freeCount>0);
54 void* result = m_firstFree;
55 m_firstFree = *(void**)m_firstFree;//分配一个Object大小,并把初始位置更新为下一个分配地址。
56 --m_freeCount;
57 return result;
58 }
59
60 bool validPtr(void* ptr)
61 {
62 if (ptr) {
63 if (((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize))
64 {
65 return true;
66 }
67 }
68 return false;
69 }
70
71 void freeMemory(void* ptr)
72 {
73 if (ptr) {
74 btAssert((unsigned char*)ptr >= m_pool && (unsigned char*)ptr < m_pool + m_maxElements * m_elemSize);
75
76 *(void**)ptr = m_firstFree;//更新地址
77 m_firstFree = ptr;
78 ++m_freeCount;
79 }
80 }
81
82 int getElementSize() const
83 {
84 return m_elemSize;
85 }
86
87 unsigned char* getPoolAddress()
88 {
89 return m_pool;
90 }
91
92 const unsigned char* getPoolAddress() const
93 {
94 return m_pool;
95 }
96
97 };
posted on 2012-04-08 15:41  littlepearl  阅读(264)  评论(0编辑  收藏  举报