博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uCGUI动态内存管理
阅读量:6704 次
发布时间:2019-06-25

本文共 2516 字,大约阅读时间需要 8 分钟。

动态内存的堆区

/* 堆区共用体定义 */typedef union {        /* 可以以4字节来访问堆区,也可以以1个字节来访问 */  int aintHeap[GUI_ALLOC_SIZE / 4];   /* required for proper alignement */  U8  abHeap[GUI_ALLOC_SIZE];} GUI_HEAP;/* 堆区的数据 */GUI_MEM_ALLOC GUI_HEAP GUI_Heap GUI_ALLOC_LOCATION;

管理动态内存需要的管理信息节点结构体

/* 动态内存管理信息节点结构体 *//* 通过管理节点结构体就可以定位一个数据块在堆区中的位置和大小,以及其前一个和后一个数据块的节点信息 *//* 由此,可以遍历整个堆区,这也就是uCGUI动态内存管理的一种方法,主要体现在这种数据结构上 */typedef struct {  GUI_ALLOC_DATATYPE Off;       /* Offset of memory area          */ //一个数据块在动态内存中的相对地址偏移  GUI_ALLOC_DATATYPE Size;      /* usable size of allocated block */ //数据块的大小  HANDLE Next;         /* next handle in linked list     */          //前一个数据块的管理信息节点在aBlock中的位置  HANDLE Prev;                                                                                                             //后一个数据块的管理信息节点在aBlock中的位置} tBlock;/* 管理信息节点的结构体链表 */static tBlock aBlock[GUI_MAXBLOCKS];其中GUI_MAXBLOCKS的定义如下:#ifndef GUI_MAXBLOCKS  #define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32)#endif

记录堆区整体使用情况的结构体

/* 记录堆区使用情况的结构体 */struct {  int                       NumUsedBlocks,                      //已经使用的数据块数目                                        NumFreeBlocks,          //还未使用的数据块数目                                                                //(注意这里指的是管理信息节点存储区aBlock的使用情况)                                 NumFreeBlocksMin; /* For statistical purposes only */  GUI_ALLOC_DATATYPE NumUsedBytes,                              //堆区已经使用的字节数                                         NumFreeBytes,          //堆区还未使用的字节数                                    NumFreeBytesMin;} GUI_ALLOC;

漫谈uCGUI管理动态内存区的方法

  动态内存分配和释放是动态内存库函数提供给用户最基本的功能,额外的功能包括查询当前堆区的使用情况、可利用情况、可使用的单块的最大size等。动态内存的库函数实现有不同的方法,可以不需要借助于堆区以外的管理结构体,仅仅使用堆区以内少量的空间作为堆区的管理空间,笔者曾经实现过,参考。动态内存的管理如果借助于堆区以外的管理结构体,自然消耗了更多的RAM空间,但是管理的效果自然提升很多。这里主要体现在分配和释放的速度,堆区的内存碎片整理,以及堆区使用情况的监控。

  uCGUI就是通过借助于堆区以外的管理结构体来实现动态内存的管理。其中堆区就是有效的数据区,堆区的管理不会占用这里边的空间。节点信息管理结构体数组aBlock,它的元素个数是根据堆区大小和预定义一个分配数据块大小确定的。uCGUI还定义了一个记录堆区使用情况的全局信息结构体变量GUI_ALLOC。

  当用户欲从堆区中分配一定大小的数据块,首先根据全局信息结构体变量GUI_ALLOC记录的可使用情况,核查当前堆区是否能够满足用户的需求,显然如果没有足够的空间,直接就以错误的形式返回。接下来,要从aBlock数组中获取一个信息管理结构体节点,获取到的节点在数组中的位置,也就是它是数组的第几个元素,被定义为句柄。然后根据节点信息管理结构体数组记录的块信息,从堆区中找到一个可以使用的块。最后,将这个分配到的块信息记录在之前分配到的管理节点中,就完成了它们之间的绑定。还需要对应的修改全局信息结构体变量GUI_ALLOC相应元素的值。

  常用的malloc函数动态获取一个内存块后返回的是这个内存块的首地址,而uCGUI返回的是这个内存块在节点管理数组中的位置,也就是句柄。当前uCGUI完全可以做到返回内存块的地址,但是uCGUI分配到的内存块是用来保存窗口和控件的管理信息的,使用句柄比使用内存块的首地址更具有优势。

 Attention:

  uCGUI的节点信息管理结构体数组一个元素分配之后,对应着一个数据块。一个窗口在创建的时候,通常只占用一个32个字节的数据块(这里假定NumExtraBytes为0)。但是,一个控件创建的时候,占用了不止一个数据块,耗费的空间也非常大。

 

转载地址:http://bbflo.baihongyu.com/

你可能感兴趣的文章
排序算法---希尔排序
查看>>
mysql 无法启动 Can't find file: './mysql/plugin.frm'
查看>>
oracle10g linux手工建库
查看>>
tcpdump抓取oracle报文以及使用Wireshark分析
查看>>
thinkphp http类的应用
查看>>
oKit-解决运营过程中产生的大数据图片造成的困扰
查看>>
cocos2d-x 22种特效
查看>>
时间与爱
查看>>
解决chrome下文字大小不能小于12px的bug
查看>>
第1章:sed语法和基本命令(1)
查看>>
TCP連接狀態及三次握手四次揮手
查看>>
Linux常用命令汇总
查看>>
实现自定义的actuator端点
查看>>
爱情,是一场狡猾的战斗!
查看>>
rabbitmq在redhat5.5下搭建部署
查看>>
10.8.2,ssd开启trim
查看>>
Mac os X 必备的System Info 最新版
查看>>
配置管理小报100208:如何在不覆盖本地文件的情况下,获取文件的某个历史版本...
查看>>
android:name 的秘密
查看>>
开启简单的web服务器成为文件下载服务器
查看>>