c++内存优化:二级间接索引模式内存池
/*********************************************************
在一些不确定内存总占用量的情形下,频繁的使用new申请内存,再通过链表
进行索引似乎是很常规的做法。自然,也很难做到随机定位。
下面的内存池类是用二层索引表来对内存进行大块划分,任何一个块均只需索
引3次即可定位。
索引数量,每索引块的分配单元数量,以及分配单元的字节长度均需为2的整数
次幂(为了运算时的效率)
//by:www.frombyte.com 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[];//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;
};
在一些不确定内存总占用量的情形下,频繁的使用new申请内存,再通过链表
进行索引似乎是很常规的做法。自然,也很难做到随机定位。
下面的内存池类是用二层索引表来对内存进行大块划分,任何一个块均只需索
引3次即可定位。
索引数量,每索引块的分配单元数量,以及分配单元的字节长度均需为2的整数
次幂(为了运算时的效率)
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 = ; if (!x)
return ;
if (!(x & 0xffff)) {
x >>= ;
r += ;
}
if (!(x & 0xff)) {
x >>= ;
r += ;
}
if (!(x & 0xf)) {
x >>= ;
r += ;
}
if (!(x & )) {
x >>= ;
r += ;
}
if (!(x & )) {
x >>= ;
r += ;
}
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=;i<DEEP;i++)
{
if(t<TBT[i][])
break;
t-=TBT[i][];
}
//i便是深度,t是深度内的n
lpt=pHead->pROOT_INDEX[i-];
int D;
for(ii=;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=;i<in.nIndexNum;i++)
{
LPSTR *pp=pDouble_Indirect[i];
if(pp==NULL)
break;
for(int ii=;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,,sizeof(in));
in=*in_m;
m_UnitTotalNum=;
nFree[]=nFree[]=nFree[]=; m_Vblkbytes= in.nUnitBytes *in.nUnitPerIndex;
m_log2Runits=ffs(in.nUnitPerIndex)-;
m_log2Rindexs=ffs(in.nIndexNum)-;
m_log2UnitBytes=ffs(in.nUnitBytes)-; m_log2Lindexs=sizeof(UINT)*-m_log2Rindexs;
m_log2Lunits=sizeof(UINT)*-m_log2Runits; //2、初始化二级索引表
pDouble_Indirect=new LPSTR* [in.nIndexNum];
memset(pDouble_Indirect,,in.nIndexNum*sizeof(LPSTR));
nFree[]=in.nIndexNum;
}
LPSTR MemTable::NEW()
{
LPSTR lpReturn;
if(nFree[]==)//直接块用光了
{
if(nFree[]==)
{
if(nFree[]==)
return NULL;//写日志:达到最大分配数量 pIndirect=pDouble_Indirect[in.nIndexNum - nFree[]]=new LPSTR [in.nIndexNum];
memset(pIndirect,,in.nIndexNum*sizeof(LPSTR));
nFree[]=in.nIndexNum-; lpReturn=pIndirect[]=new char[m_Vblkbytes];
memset(lpReturn,,m_Vblkbytes);
nFree[]=in.nUnitPerIndex-;
m_lpFirstFree = lpReturn + in.nUnitBytes;
nFree[]--; }
else
{
lpReturn=pIndirect[in.nIndexNum - nFree[]]=new char[m_Vblkbytes];
memset(lpReturn,,m_Vblkbytes);
nFree[]--;
nFree[]=in.nUnitPerIndex-;
m_lpFirstFree = lpReturn + in.nUnitBytes;
}
}
else
{
lpReturn=m_lpFirstFree;
nFree[]--;
m_lpFirstFree += in.nUnitBytes;
}
m_UnitTotalNum++;
return lpReturn; }//by:www.frombyte.com zhangyu(zhangyu.blog.51cto.com)
UINT MemTable::NEW(UINT n)
{
UINT nReturn=m_UnitTotalNum;
for(int i=;i<n;i++)
NEW();
return nReturn; }
LPSTR MemTable::NEW_CONTINUEOUS(UINT n)
{
LPSTR lpReturn;
if(n>in.nUnitPerIndex)
return NULL; if(nFree[]>=n)
{
nFree[]-=n;
lpReturn=m_lpFirstFree;
m_UnitTotalNum+=n;
m_lpFirstFree += (n*in.nUnitBytes);
}
else
{
m_UnitTotalNum+=nFree[];//剩余空间保留、忽略
nFree[]=;
lpReturn=NEW();
nFree[] -= (n-);
m_lpFirstFree += ((n-)*in.nUnitBytes);
m_UnitTotalNum += (n-);
}
return lpReturn;
}
LPSTR MemTable::GET(UINT n)
{ //by:www.frombyte.com 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++内存优化:二级间接索引模式内存池的更多相关文章
- SQL Server 内存优化表的索引设计
测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...
- linux内存优化之手工释放linux内存
先介绍下free命令 Linux free命令用于显示内存状态. free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等. 语法: free [- ...
- 试试SQLSERVER2014的内存优化表
试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...
- SQLServer2014内存优化表评测
SQLServer2014内存优化表评测 分类: SQL内存表2014-06-20 11:49 1619人阅读 评论(11) 收藏 举报 目录(?)[-] SQLServer2014的使用基本要求 内 ...
- SQLSERVER2014的内存优化表
SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载. 就算如此, ...
- 试试SQLServer 2014的内存优化表
SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...
- 试试SQLServer 2014的内存优化表(转载)
SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据 ...
- Android 性能优化 - 详解内存优化的来龙去脉
前言 APP内存的使用,是评价一款应用性能高低的一个重要指标.虽然现在智能手机的内存越来越大,但是一个好的应用应该将效率发挥到极致,精益求精. 这一篇中我们将着重介绍Android的内存优化.本文的篇 ...
- android 开发如何做内存优化
不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露.其实如果我 们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造 ...
随机推荐
- STAR法则
现在相信大部分跳槽的朋友都已经将工作辞了,正在找工作的这个漩涡中,还没辞掉的可能也快了,找工作的这段时间是一个非常考验你的扛打击能力的时候.像网上投了几十家简历,只有几家邀请面试的,其他都是连面试阶段 ...
- ES(二): Build ES Cluster on Azure VM
目录: 系统环境准备 安装ES集群 安装Kibana 安装x-pack 安装head 系统环境准备 参见: HDP2.4安装(二):Centos7配置 修改network: 修改hosts: 配置ss ...
- DEV下拉框LookUpEdit使用技巧
1,首先设置LookUpEdit要绑定的列,并配置隐藏列 2,设置下拉框是否显示表头,底部 3.设置下拉框宽度 4.设置显示的列与值列 5.设置初始值 6,绑定数据 7,取值
- linux 下安装eclipse和pydev插件用来开发python程序
1.网上的教程要求必须要安装java虚拟机,但是我觉得不用,但是为了不出意外就装吧. (1)去官网下载安装包www.sun.com (2)安装包是.tar.gz的可以用 tar -xzvf +压缩包路 ...
- MySQL逻辑备份利器-mydumper
关于mydumper的简介和下载请访问:https://launchpad.net/mydumper 简言之,mydumper是多线程逻辑备份,对于表和数据量很大的情况下,建议使用mydumper提高 ...
- 文件上传----FTP部署
- 网络传入安全jwts
使用json web token 发表于Aug 13 2014 由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用 ...
- DOM基础(四)
每次写DOM的时候,就觉得好像没什么好写,因为涉及到知识点的方面的确不多,对于DOM来说,更多的还是练习为主.在练习的时候,最好能结合着js基础语法的知识点来学习.这样,在学习DOM的时候就不会那么枯 ...
- 队列工厂之(MSMQ)
最近vs2017神器正式版发布让人很是激动,vs2017支持了很多语言的开发,从前端-后端-底层的支持,堪称是工具中的神器:netcore我喜爱的架构之一也得到了大力的宣传,应群友的邀请将在队列工厂( ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...