C++ 内存分配回收的一种快速方法

来源:互联网 发布:mac怎么调系统字体大小 编辑:程序博客网 时间:2024/06/13 03:47

有的时候我们需要高速分配和回收,可以用如下模板



#pragma once#include <set>#include <assert.h>using namespace std;template<class T, unsigned int max_block_cnt>class private_block_pool{public:void* operator new(unsigned int cbCnt){//从free集合种取第一个idif(private_block_pool<T,max_block_cnt>::m_s_b_init_private_block){set<unsigned int>::iterator iter = m_s_set_freeBlockID.begin();if(iter == m_s_set_freeBlockID.end()){return 0;}((private_block_pool*)(&(m_s_mem[(*iter) * sizeof(T)])))->m_uBlockID = *iter;m_s_set_freeBlockID.insert(*iter);return (T*)(&(m_s_mem[(*iter) * sizeof(T)]));}else{return 0;}}void* operator new[](unsigned int cbcnt){ATLASSERT(0 && "this class can not alloc array");return 0;}void operator delete[](void* parray){}void operator delete(void* pObj){if(pObj){set<unsigned int>::iterator i = m_s_alloced_blockID.find(((private_block_pool*)pObj)->m_uBlockID);if(i != m_s_alloced_blockID.end()){m_s_alloced_blockID.erase(i);m_s_set_freeBlockID.insert(((private_block_pool*)pObj)->m_uBlockID);}}}public:static unsigned char* m_s_mem ; //私有内存区域static set<unsigned int> m_s_set_freeBlockID;static set<unsigned int> m_s_alloced_blockID;static bool m_s_b_init_private_block;private:unsigned int m_uBlockID;//块的index};template<class T, unsigned int max_block_cnt>unsigned char* private_block_pool<T, max_block_cnt>::m_s_mem  = 0;template<class T, unsigned int max_block_cnt>set<unsigned int> private_block_pool<T, max_block_cnt>::m_s_set_freeBlockID;template<class T, unsigned int max_block_cnt>set<unsigned int> private_block_pool<T, max_block_cnt>::m_s_alloced_blockID;template<class T, unsigned int max_block_cnt>bool __t_init_private_pool_mgr( ){static unsigned char s_mem[max_block_cnt * sizeof(T)] = {};private_block_pool<T, max_block_cnt>::m_s_mem = s_mem;for(unsigned i = 0; i < max_block_cnt; i++){private_block_pool<T, max_block_cnt>::m_s_set_freeBlockID.insert(i);}return private_block_pool<T, max_block_cnt>::m_s_mem != 0;}template<class T, unsigned int max_block_cnt>bool private_block_pool<T, max_block_cnt>::m_s_b_init_private_block = __t_init_private_pool_mgr<T,max_block_cnt>( );





0 0