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
- C++ 内存分配回收的一种快速方法
- 内存的分配和回收
- C/C++动态内存分配和回收
- C/C++分配内存的方法
- 一种快速解决JAVA内存泄漏问题的方法
- 一种快速解决JAVA内存泄漏问题的方法
- 对象内存的分配及回收
- JAVA 内存的分配与回收
- 内存的连续分配与回收算法
- JVM的垃圾回收与内存分配
- 堆内存的分配和回收步骤
- java 对象的内存分配和回收
- Android的内存分配与回收
- 【证】:内存的分配与回收策略
- Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
- C的内存分配
- 内存分配、回收、调优
- C语言内存的动态存储管理3-分配算法和回收
- git使用规范流程
- 排序算法
- Java或Android过滤合法的中英文字符
- Vuforia Virtual Button(虚拟按钮)使用技巧
- Kafka基本架构
- C++ 内存分配回收的一种快速方法
- 网页数据采集难点
- oracle数据库锁表查询及解锁sql
- ajax解析json格式循环显示
- 11.22今天学了
- 在发送ajax请求时加时间戳或者随机数去除js缓存
- android TabHost 修改底部条颜色
- Android酷炫实用的开源框架(UI框架)
- ORACLE PL/SQL编程之六:把过程与函数说透