c++内存优化:二级间接索引模式内存池
.H内容如下:
- /*********************************************************
- 在一些不确定内存总占用量的情形下,频繁的使用new申请内存,再通过链表
- 进行索引似乎是很常规的做法。自然,也很难做到随机定位。
- 下面的内存池类是用二层索引表来对内存进行大块划分,任何一个块均只需索
- 引3次即可定位。
- 索引数量,每索引块的分配单元数量,以及分配单元的字节长度均需为2的整数
- 次幂(为了运算时的效率)
- //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
- *********************************************************/
- class MemTable
- {
- public:
- MemTable(void);
- public:
- ~MemTable(void);
- public:
- void CREATE(MemTableIn *in_m);
- void DEL();
- LPSTR NEW();//分配一个unit
- LPSTR NEW_CONTINUEOUS(UINT n);//用于连续分配若干个unit
- UINT NEW(UINT n); //用于可碎片方式分配若干个unit
- LPSTR GET(UINT n);//用来获得第n个分配的指针地址
- int get_totle_unitnum();
- public:
- MemTableIn in;
- LPSTR **pDouble_Indirect;
- LPSTR lpBitmap;
- LPSTR *pIndirect;
- LPSTR m_lpFirstFree;
- int nFree[3];//0表示二级索引的自由,1表示1级索引的自由,2表示块自由索引号
- INT32 m_EndBlkUseredUnits;
- int m_Vblkbytes;
- UINT m_UnitTotalNum;
- UINT m_log2Rindexs,m_log2Runits,m_log2Rbitmap,m_log2Lindexs,m_log2Lunits,m_log2Lbitmap;
- UINT m_log2UnitBytes;
- UINT m_index2ID,m_index1ID,m_UnitID;
- };
.CPP内容如下:
- /**
- * ffs - Find the first set bit in an int
- * @x:
- *
- * Description...用来统计一个整型数据的最高为1的位,后面有多少位。
- *换个说法:从最高位开始找1,找到1后,看这个二进制数据1000....000是2的几次方
- *
- * Returns:
- */
- int ffs(int x)
- {
- int r = 1;
- if (!x)
- return 0;
- if (!(x & 0xffff)) {
- x >>= 16;
- r += 16;
- }
- if (!(x & 0xff)) {
- x >>= 8;
- r += 8;
- }
- if (!(x & 0xf)) {
- x >>= 4;
- r += 4;
- }
- if (!(x & 3)) {
- x >>= 2;
- r += 2;
- }
- if (!(x & 1)) {
- x >>= 1;
- r += 1;
- }
- return r;
- }
- LPSTR MemTree::GET(MemTreeHead *pHead,UINT n)
- {
- int t;
- LPSTR lpt;
- int i,ii;
- //判断是否直接存储
- if(n<m.rootDirectUnitNum)
- return pHead->lpRootUnit + n*m.Vsizeof;
- else
- t=n-m.rootDirectUnitNum;
- for(i=1;i<DEEP;i++)
- {
- if(t<TBT[i][0])
- break;
- t-=TBT[i][0];
- }
- //i便是深度,t是深度内的n
- lpt=pHead->pROOT_INDEX[i-1];
- int D;
- for(ii=1;ii<i;ii++)
- {
- D=t /TBT[i][ii];
- t=t % TBT[i][ii];
- lpt=*(LPSTR*)(lpt+sizeof(LPSTR)*D);
- }
- return (lpt + t*m.Vsizeof);
- }
- MemTable::MemTable(void)
- {
- }
- MemTable::~MemTable(void)
- {
- //释放所有空间
- for(int i=0;i<in.nIndexNum;i++)
- {
- LPSTR *pp=pDouble_Indirect[i];
- if(pp==NULL)
- break;
- for(int ii=0;ii<in.nIndexNum;ii++)
- {
- LPSTR p=pp[ii];
- if(p==NULL)
- break;
- else
- delete [] p;
- }
- delete [] pp;
- }
- delete [] pDouble_Indirect;
- }
- void MemTable::CREATE(MemTableIn *in_m)
- {
- //1、初始化一些参考块
- memset(&in,0,sizeof(in));
- in=*in_m;
- m_UnitTotalNum=0;
- nFree[0]=nFree[1]=nFree[2]=0;
- m_Vblkbytes= in.nUnitBytes *in.nUnitPerIndex;
- m_log2Runits=ffs(in.nUnitPerIndex)-1;
- m_log2Rindexs=ffs(in.nIndexNum)-1;
- m_log2UnitBytes=ffs(in.nUnitBytes)-1;
- m_log2Lindexs=sizeof(UINT)*8-m_log2Rindexs;
- m_log2Lunits=sizeof(UINT)*8-m_log2Runits;
- //2、初始化二级索引表
- pDouble_Indirect=new LPSTR* [in.nIndexNum];
- memset(pDouble_Indirect,0,in.nIndexNum*sizeof(LPSTR));
- nFree[0]=in.nIndexNum;
- }
- LPSTR MemTable::NEW()
- {
- LPSTR lpReturn;
- if(nFree[2]==0)//直接块用光了
- {
- if(nFree[1]==0)
- {
- if(nFree[0]==0)
- return NULL;//写日志:达到最大分配数量
- pIndirect=pDouble_Indirect[in.nIndexNum - nFree[0]]=new LPSTR [in.nIndexNum];
- memset(pIndirect,0,in.nIndexNum*sizeof(LPSTR));
- nFree[1]=in.nIndexNum-1;
- lpReturn=pIndirect[0]=new char[m_Vblkbytes];
- memset(lpReturn,0,m_Vblkbytes);
- nFree[2]=in.nUnitPerIndex-1;
- m_lpFirstFree = lpReturn + in.nUnitBytes;
- nFree[0]--;
- }
- else
- {
- lpReturn=pIndirect[in.nIndexNum - nFree[1]]=new char[m_Vblkbytes];
- memset(lpReturn,0,m_Vblkbytes);
- nFree[1]--;
- nFree[2]=in.nUnitPerIndex-1;
- m_lpFirstFree = lpReturn + in.nUnitBytes;
- }
- }
- else
- {
- lpReturn=m_lpFirstFree;
- nFree[2]--;
- m_lpFirstFree += in.nUnitBytes;
- }
- m_UnitTotalNum++;
- return lpReturn;
- }//by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
- UINT MemTable::NEW(UINT n)
- {
- UINT nReturn=m_UnitTotalNum;
- for(int i=0;i<n;i++)
- NEW();
- return nReturn;
- }
- LPSTR MemTable::NEW_CONTINUEOUS(UINT n)
- {
- LPSTR lpReturn;
- if(n>in.nUnitPerIndex)
- return NULL;
- if(nFree[2]>=n)
- {
- nFree[2]-=n;
- lpReturn=m_lpFirstFree;
- m_UnitTotalNum+=n;
- m_lpFirstFree += (n*in.nUnitBytes);
- }
- else
- {
- m_UnitTotalNum+=nFree[2];//剩余空间保留、忽略
- nFree[2]=0;
- lpReturn=NEW();
- nFree[2] -= (n-1);
- m_lpFirstFree += ((n-1)*in.nUnitBytes);
- m_UnitTotalNum += (n-1);
- }
- return lpReturn;
- }
- LPSTR MemTable::GET(UINT n)
- { //by:www.datahf.net zhangyu(zhangyu.blog.51cto.com)
- if(n>=m_UnitTotalNum)
- return NULL;//写日志:超过范围
- m_UnitID=n<< m_log2Lunits >>m_log2Lunits;
- m_index1ID=n >> m_log2Runits;
- m_index2ID=m_index1ID >> m_log2Rindexs;
- m_index1ID=m_index1ID <<m_log2Lindexs >>m_log2Lindexs;
- return (pDouble_Indirect[m_index2ID][m_index1ID] + (m_UnitID<<m_log2UnitBytes));
- }
- void MemTable::DEL()
- {
- }
c++内存优化:二级间接索引模式内存池相关推荐
- 操作系统-文件管理习题详细解析:设文件索引结点中又7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均
题目:设文件索引结点中又7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均为256B,则可表示的单个 ...
- java内存优化详解_jvm堆内存优化详解
在日常的运维工作中用到tomcat,都需要对tomcat中的jvm虚拟机进行优化,只有知道需要优化参数的具体用处,才能深刻体会优化jvm的意义所在. 在平常的工作中我们谈对jvm的优化,主要是针对ja ...
- android加载大量图片内存优化,Android图片加载内存优化
利用BitmapFactory.Options实现图片内存优化 通过设置options.inPreferredConfig控制内存占用 首先准备了一张1280x800的blue_bg.png图片,我们 ...
- Android 内存优化实操,定位内存问题
文章目录 一.内存泄漏定位 1.观察法: 2.使用内存分析工具 2-1.收集内存快照 2-2.hprof文件转换 2-3.Mat分析内存 二.内存抖动 三.优化内存空间 1.减少不必要的内存开销 2. ...
- 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...
- 内存优化-使用tcmalloc分析解决内存泄漏和内存暴涨问题
其实我一直很想写关于tcmalloc的内存泄漏检测的文章,只是一直记不起来该如何下笔,有时项目太忙,在整理这方便的思考过少,另外遇到的问题也不是很多,直到最近用tcmalloc帮A项目排查一些很棘手的 ...
- 安全管家安卓_内存优化管家v1.0下载-内存优化管家app最新版下载
内存优化管家是一款安卓手机多功能清理工具,包含了文件垃圾.缓存垃圾.广告垃圾和内存垃圾等分类清理功能,使用方法简单,一键扫描手机,即可进行不同类型的垃圾划分, 用户可以根据需求进行筛选清理,除此之外, ...
- redis持久化、内存优化、过期、LRU内存
为什么80%的码农都做不了架构师?>>> 1.过期(expire命令) 设置了失效时间的元素,对于DEL/SET/GETSET/*STORE这些会删除或者重新设置元素的命令,如 ...
- 行存储索引改换成列存储索引_索引策略–第2部分–内存优化表和列存储索引
行存储索引改换成列存储索引 In the first part we started discussion about choosing the right table structure and d ...
最新文章
- webGL的一些咨询--web3D
- leveldb源码分析:数据查询
- 拒绝穿模!新方法让虚拟偶像自由互动无障碍“贴贴”,8000网友追着点赞
- [YTU]_2918( Shape系列-4)
- C和C++中的野指针问题
- python入门学习课程推荐
- Linux统计单个文件统计
- Ubuntu 17.10安装Qt 5.10环境与Qt Creator 4.5开发工具(转自linux公社)
- 实用卷积神经网络 运用python pdf_解析卷积神经网络—深度学习实践手册 中文pdf高清版...
- 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学排名第31(2018年TFE美国排名)...
- 基于asp.net车辆管理调度系统的设计与实现
- ios APP加密探究几维安全iOS 代码混淆效果参考
- cc++语言参考手册_C ++值类别快速参考:第2部分
- SpringBoot整合MybatisPlus实战动态SQL,java定时器实现原理
- 微信小程序使用canvas画布
- 微信调试、手机QQ调试、Qzone之x5内核inspect调试解决方案
- 点餐系统架构模型_餐馆点餐系统课程设计
- px4+ros+gazebo+ORB_SLAM2室内视觉无人机导航
- Dev C++的安装以及基本使用方法
- 零束银河全栈技术解决方案之网络安全