




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
UCGUI的动态内存分配的原理了解UCGUI的朋友,一定知道UCGUI中的窗口体系,窗口一般都是由程序动态创建的,那么这当中当然要用到动态的内存申请,现在我们就来就这个话题进行深入分析,了解UCGUI中的动态内存分配,是了解其窗口体系统的基础,这一点非常的重要。先说明一下本文中用到的一些关键下词:内存分配信息节点-记录一块已分配内存块信息的tBlock结构体,可简称分配节点。内存分配信息节点数组-内存分配信息节点的数组。内存句柄-是指分配内存块数组中的元素位置索引值。最小粒度对齐-是指内存分配大小应该为最小粒度的整数倍。一、打开动态分配的预定义选项在GUIConf.h配制文件当中,有这样一个定义。#define GUI_ALLOC_SIZE 12500/* Size of dynamic memory . For WM and memory devices*/GUI_ALLOC_SIZE定义的即是整个UCGUI中可用于动态分配的内存大小,这个大小且不能为0,也只有当这个预定义打开后,才能使用UCGUI提供的动态内存分配的功能在GUIAlloc.c文件中提供。二、动态内存分配的基本功能在GUI.h中一段提供了如下一段定义,即:/* Dynamic memory management*/#if !defined(GUI_ALLOC_ALLOC)void GUI_ALLOC_Init(void);void* GUI_ALLOC_h2p (GUI_HMEMhMem);void GUI_ALLOC_Free (GUI_HMEMhMem);void GUI_ALLOC_FreePtr (GUI_HMEM *phMem);GUI_HMEM GUI_ALLOC_Alloc(int size);/* diagnostics */int GUI_ALLOC_GetUsed(void);int GUI_ALLOC_GetNumFreeBytes(void);int GUI_ALLOC_GetMaxSize(void);/* macros */#define GUI_ALLOC_ALLOC(size) GUI_ALLOC_Alloc(size)#define GUI_ALLOC_H2P(h) GUI_ALLOC_h2p(h)#define GUI_ALLOC_FREE(handle) GUI_ALLOC_Free(handle)#define GUI_ALLOC_LOCK(handle) GUI_ALLOC_h2p(handle)#define GUI_ALLOC_UNLOCK(handle)#endif总的来说,动态内存分配提供了如下几组功能:1,动态内存初始化。GUI_ALLOC_Init2,动态内存分配、释放、加解锁;以及碎片整理。GUI_ALLOC_Free/GUI_ALLOC_Alloc、GUI_ALLOC_LOCK/GUI_ALLOC_UNLOCK3,动态内存使用情况统计。GUI_ALLOC_GetUsed、GUI_ALLOC_GetNumFreeBytes、GUI_ALLOC_GetMaxSize三、动态内存分配的实现原理1,首先介绍几个有关动态内存分配的常量及结构。-常量GUI_ALLOC_SIZE-可用于分配的大小,如开启动态内存分配,在预定义中已经规定必须大于0,否则编译无法通。GUI_ALLOC_AUTDEFRAG-是否进行碎片整理,只有在请求在内存不能满足时才须要将碎片整理,须将所有已分配内存数据前移,例 如总共大小为12500,当内配到最后剩200字节,但请求800字节,此时如果定义了碎片整理,则会将之前未用碎片整理出来,将所有已分配的内存都往前移,将碎片整到后面合成一个大的剩余空间。GUI_BLOCK_ALIGN-内存分配的对齐值,是为保证每块分配的内存均从对齐粒度开始,其值为4个字节。如要求2931字节则实 得32字节,即(29+3)&0xfffffffc,这是在Size2LegalSize完成的。GUI_MAXBLOCKS-最多可分的内存块数,是内存分配信息记录数组的大小,它决定了将内存正好分配完时每块的最小数值, 这个最小数值为32,在后面中我们称其每一元素为内存分配信息节点tALLOCINT-记录每块内存偏移内存起始点的依稀的变量类型,2字节还是4字节,GUI_ALLOC_SIZE大于32767时,要用 四字节类型。HANDLE-内存块句柄类型,1字节还是2字节,当GUI_MAXBLOCKS大于256时要用2字节。#if GUI_ALLOC_SIZE = 256#define HANDLE U16#else#define HANDLE U8#endiftALLOCINT,HANDLE的定义会影响到用记载每一块内存的信息结点的大小,即用于动态内存分配的开消。-结构记录每个内存块信息的节点结构。typedef struct tALLOCINT Off; /* Offset of memory area */tALLOCINT Size; /* usable size of allocated block */HANDLE Next;/* next handle in linked list */HANDLE Prev; tBlock;Off-记录此块内存相对整个内存起始点的偏移。Size-记录此块内存大小。Next-记录此块内存之一下一块内存之指针,其实为这里是指下一块内存在内存分配信息记录数组中的第几个元素。Prev-记录此块内存之上一内存之指针。下面这个结构的定义在GUI.h当中typedef union int aintHeapGUI_ALLOC_SIZE/4; /* required for proper alignement */U8abHeapGUI_ALLOC_SIZE; GUI_HEAP;GUI_HEAP GUI_Heap; /* Public for debugging only */static tBlock aBlockGUI_MAXBLOCKS;从上面,可以知道,UCGUI中的内存分配,其实质是通过一大块全局数组的空间来实现的,这个内存是在编译程序后分配的。它的大小是即是在 GUIConf.h中预定义的GUI_ALLOC_SIZE个字节,但同时通过GUI_HEAP这个联合,以abHeap来访问是基于1字节, aintHeap则是基于4字节。aBlock是用于记录所有内存分配块的数组,大小是GUI_MAXBLOCKS, GUI_MAXBLOCKS=(2+GUI_ALLOC_SIZE/32),每一个元素记录一个内存分配块的信息,只要知道了内存分配块的位置就可以从数组中取出该分配块的信息。其实所有的内存分配块不光记录在这一数姐中,而且已经构成了一个双链表,这对于遍历所有已经分配的内存块非常的方便。struct int NumUsedBlocks, NumFreeBlocks, NumFreeBlocksMin; /* For statistical purposes only */tALLOCINT NumUsedBytes,NumFreeBytes,NumFreeBytesMin; GUI_ALLOC;以上的结构记录每次进行内存分配后的已用块、空闲块、最小空闲块、已分配字节、剩余字节、最小空闲字节。其实最小空闲块与最小空闲字节与空闲块、剩余字节用处差不多,其值是相等的。2,实现动态内存分配的函数详解。-初始化void GUI_ALLOC_Init(void);主要初始化GUI_ALLOC这个整体内存分配信息结构,并置已经初始化状态,初始化了第一个内存分配结点:aBlock0.Size = (1GUI_BLOCK_ALIGN);/* occupy minimum for a block */aBlock0.Off= 0;aBlock0.Next = 0;注意这个结点其实是用于双链表的头结点,其大小为最小分配对齐粒度,偏移是0即从整个动态内存的起始。它一直存在,并不会被释放或者改变大小,总之是不会有任何变化,当所有块都分配完或是释放掉,它都是头结点。其实它的作是就是为了维护内存分配信息节点双链表的。-分配GUI_HMEM GUI_ALLOC_Alloc(int size);这个函数,它实际是调用_Alloc进行内存分配的,这个函数主要完成以下所做的。1、调用Size2LegalSize将要分配内存大小调整至最小粒度对齐。2、寻找可用于记录此块分配信息的节点,在FindFreeHandle中完成。3、寻找在整个内存分配空间中从低至高可满足此次分配的区域,在FindHole中完成,有几种情况,将在FindHole说明。4、如果剩余字节不够分配,当预定义碎片整理时,调用CreateHole进行整理,CreateHole反回分配信息节点。5、将分配所取得的内存分配信息节点加入双链表、初始化此次分配内存为0值、更新GUI_ALLOC这个整体分配结构体信息。 Size2LegalSize size = (size + (1GUI_BLOCK_ALIGN)-1) & (1= Size 这个条件满足,即调整碎片后所得的剩余空间满足此次分配,那么就返回i值,i值即为双链表中最后一结点;如果调整碎片后还是无法满足些次分配,那上面那个条件不成立,那么还是返回-1,即此次分配失败。总结:关于碎片整理,是比较花时间的,这个时间也每次可以都不确定。-释放释放与分配比起来,所做的工作少多了。GUI_ALLOC_Free与GUI_ALLOC_FreePtr,两者完成同样功能,参数不同而已。1、根据参数中指定中的内存句柄,将些内存句柄指对应分配节点size清零,对应内存清为0xcc,并将节点从双链表中清除。2、更新GUI_ALLOC中记录的整体内存使用情况信息。-整体内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 赡养协议书范文
- 暑假培优练:平抛运动(学生版)-2025高一物理暑假专项提升(人教版)
- 人教版八年级英语上册Unit4标准检测卷(含答案)
- 新解读《GB-T 18508-2014城镇土地估价规程》
- 图形的变换-2023学年九年级数学专项复习(沪教版)
- 重庆创业红娘培训课件
- 老年人肿瘤课件
- 《商务英语阅读3》课程简介与教学大纲
- 《大学英语2A》课程简介与教学大纲
- 醉翁亭记课件
- 《应用语文(第3版)》技工院校语文课程全套教学课件
- 《石油钻采设备》课件
- 老人居家治疗指南解读
- 瓦斯超限撤人流程及应急处置培训
- 创新园管理制度
- 小学一年级第一学期数学兴趣小组计划
- 第五届绵阳市职业技能大赛赛项技术文件-健康和社会照护
- 肾切除患者护理疑难病例
- 人力管理咨询合同范本
- 2025译林版高中英语高考复习必背全七册单词表(精校打印)
- 2025年变压器绝缘材料项目可行性研究报告
评论
0/150
提交评论