袖珍版固定大小 内存池1(c语言)
来源:互联网 发布:java scanner读取多行 编辑:程序博客网 时间:2024/05/16 10:26
1支持内存的快速申请和释放 一共约100行代码
2 支持任意大小的固定块 一共约100行代码
3支持多线程 设计完成,还没时间做
4支持内存整理
这是预计的,现在的1也可以用,能满足我的使用要求,有时间再做的更好些吧
因为代码没带全,明天再发
这几天忘记了,补上
typedef struct BlockList{structBlockList *NextBlock;//下一个块structBlockList *ForBlock;//上一个块char*Mem;//实际的内存intFristFree;//第一个空闲块,-1表示没有空闲了intLastFree;//最后一个空闲的内存块,这两个里面存的都是空间块序号intNumberOfSpace;//记录一块有多少小空间intNumberOfBlock;// 标示这是第几个块int*FreeList;//指向空闲序号维护数组}BLOCKList,*BLOCKLIST;//小空间固定目前固定的是1024bytestruct MemStruct{int*Number[256000];//内存序号BLOCKLIST FristBlock;//记录第一个内存块};
struct BlockList MemBase;struct MemStruct MemRoot;//一个保存了序号表和第一个内存块的结构int NewSpace(void);//获取一个新的地址bool DeleteSpace(int number);//销毁一段空间void InitMemManage(int BlockSize,int Number);//初始化一个内存池void AddNewBlock(BLOCKLIST ForBlock);//添加一个新的内存块/*初始化内存管理器*/void InitMemManage(int BlockSize,int Number){int i;MemBase.ForBlock = MemBase.NextBlock = NULL;//初始化链表指针MemBase.FristFree = 0;MemBase.LastFree = Number-1;//指向最后一个空间序号MemBase.NumberOfSpace = Number;//每个块内有多少个小空间MemBase.NumberOfBlock = 0;//块计数MemBase.Mem = new(char[Number*1024]);//申请地址,包含了指向下一个空闲地址的指针MemBase.FreeList =new(int[Number]);//下一个空闲列表for(i=0;i<Number;i++){MemBase.FreeList[i]=i+1;}MemBase.FreeList[Number-1]=-1;//修改最后一个序号MemRoot.FristBlock = &MemBase;}/*添加一个新的内存块*/void AddNewBlock(BLOCKLIST ForBlock){BLOCKLIST tmp;int i;ForBlock->NextBlock = tmp=new(struct BlockList);//申请一个新的空间tmp->ForBlock=ForBlock;//完成指针的链接tmp->NextBlock=NULL;tmp->NumberOfSpace=ForBlock->NumberOfSpace;tmp->NumberOfBlock=ForBlock->NumberOfBlock+1;tmp->Mem = new(char[tmp->NumberOfSpace*1024]);tmp->FreeList=new(int[tmp->NumberOfSpace]);for(i=0;i<tmp->NumberOfSpace;i++){tmp->FreeList[i]=i+1;}tmp->FreeList[tmp->NumberOfSpace-1]=-1;tmp->FristFree=0;tmp->LastFree=tmp->NumberOfSpace-1;}/*获取一个新的空间*/int NewSpace(void){BLOCKLIST tmp = &MemBase;int Number;//最终返回的序号//从第一个块表开始while(1){//查询是否有空if(tmp->FristFree==-1){//表示没有空闲if(tmp->NextBlock==NULL)//已经没有下一个了break;elsetmp=tmp->NextBlock;}else{//有空闲Number=tmp->NumberOfSpace*(tmp->NumberOfBlock)+tmp->FristFree;//分配了小空间,下面维护结构MemRoot.Number[Number]=(int *)(tmp->Mem + tmp->FristFree*1024);tmp->FristFree=tmp->FreeList[tmp->FristFree];//更新了第一个return Number;}}//到这里表示所有的空间都已经分配完了AddNewBlock(tmp);return NewSpace();}bool DeleteSpace(int number)//销毁空间{BLOCKLIST tmp=&MemBase;int i;if(MemRoot.Number[number]!=0){i=number/MemBase.NumberOfSpace;//取得第一个内存块号while(i!=tmp->NumberOfBlock)tmp=tmp->NextBlock;i=number%tmp->NumberOfSpace;//求取块内号tmp->FreeList[tmp->LastFree]=i;//更新尾部tmp->LastFree=i;//更新最后序号tmp->FreeList[tmp->LastFree]=-1;if(tmp->FristFree==-1)tmp->FristFree=i;MemRoot.Number[number]=0;return 0;}elsereturn 1;}
bool DeleteMemMangage(void){BLOCKLIST tmp=&MemBase;while(tmp){delete (tmp->Mem);delete (tmp->FreeList);tmp=tmp->NextBlock;}return true;}
- 袖珍版固定大小 内存池1(c语言)
- C语言-固定大小内存池
- 固定块内存池c语言实现
- [原创]:c语言基于固定块链表的内存池
- c语言基于固定块链表的内存池 (转)
- 固定大小内存池设计与实现
- 固定大小块的内存池设计
- C实现固定大小对象池
- C语言固定大小的栈的操作
- C语言固定大小的线性表的简单实现
- C#Winform固定大小
- C语言之访问固定的内存位置
- 单线程固定大小对象的内存池实现
- 单线程不固定大小对象的内存池实现
- 单线程环境中对象大小固定的内存池
- c++ 固定分配大小的简单内存池
- 对象大小固定的单线程内存池设计
- 简单实现一个固定大小的内存池
- 判断txt文件字符集
- HDFS学习随笔
- 杭电46道DP总结
- c++中栈,队列的函数操作
- 编译vsftp sysdeputil.c出错的解决办法
- 袖珍版固定大小 内存池1(c语言)
- c/c++时间例子
- 【正则】超级无敌正则表达式
- Linq to Sql中的Skip、Take
- uva 10247 - Complete Tree Labeling
- 网页框架 frame和Iframe
- 一个面试题,关于运算优先级和递增递减
- udp打洞
- DevExpress Report web 绑定数据后没有显示的解决方法