bullet中的内存池

空扰寡人 提交于 2020-02-26 22:08:56

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 };
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!