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() const34 {35 return m_freeCount;36 }37 38 int getUsedCount() const39 {40 return m_maxElements - m_freeCount;41 }42 43 int getMaxCount() const44 {45 return m_maxElements;46 }47 48 void* allocate(int size)49 {50 // release mode fix51 (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() const83 {84 return m_elemSize;85 }86 87 unsigned char* getPoolAddress()88 {89 return m_pool;90 }91 92 const unsigned char* getPoolAddress() const93 {94 return m_pool;95 }96 97 };
来源:https://www.cnblogs.com/littlepearl/archive/2012/04/08/2437691.html