日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ucGUI内存管理

發(fā)布時(shí)間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ucGUI内存管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ucGUI內(nèi)存管理分析

1.??????概述

ucGUI為了提高在不同硬件與軟件平臺(tái)的可移植性,它的內(nèi)存分配沒有用到像molloc和free這樣的與平臺(tái)相關(guān)的函數(shù)。它有自己的一套機(jī)制來管理內(nèi)存。以下詳細(xì)描述其內(nèi)存管理機(jī)制。

2.??????ucGUI需要管理的內(nèi)存

a)????????窗體:

在ucGUI里,所有的控件(control),對話框(Dialog),框架窗體(Frame)實(shí)際都是由一個(gè)或多個(gè)窗體組成,這些窗體對應(yīng)用的層的表現(xiàn)形式為句柄(Handle),關(guān)于這個(gè)句柄的含義在下面講解。在ucGUI窗體管理機(jī)制里,每種不同的窗體都有其不同的結(jié)構(gòu)體。因此這些結(jié)構(gòu)體的實(shí)例均需要納入ucGUI的內(nèi)存管理。

b)????????字符串:

幾乎所有的窗體上都有多個(gè)字符串,這些字符串對應(yīng)用層的表現(xiàn)形式也為句柄。在ucGUI內(nèi)部實(shí)際是一個(gè)普通的字符串,也需要納入ucGUI的內(nèi)存管理。

3.??????ucGUI內(nèi)存管理分析

a)????????ucGUI定義了一個(gè)全局聯(lián)合體變量來存放他所需要的內(nèi)存。定義如下:

typedef union {

? int aintHeap[GUI_ALLOC_SIZE / 4];??

? U8?abHeap[GUI_ALLOC_SIZE];

} GUI_HEAP;

之所以這樣定義,是為單字節(jié)或四字節(jié)訪問的便利性。實(shí)際的大小即為宏定義GUI_ALLOC_SIZE的大小,這個(gè)宏定義可根據(jù)用戶實(shí)際使用情況來調(diào)節(jié)。實(shí)際上就是跟應(yīng)用的復(fù)雜度相關(guān)。換句話說,就是,實(shí)際應(yīng)用中,創(chuàng)建的窗體越多,界面上需要顯示的字符串越多,需要占用的內(nèi)存就越多。

b)????????ucGUI定義了一個(gè)全局的結(jié)構(gòu)體內(nèi)存塊數(shù)組來管理這塊內(nèi)存。定義如下:

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???? */

? HANDLE Prev;

} tBlock;

static tBlock aBlock[GUI_MAXBLOCKS];

前面已經(jīng)描述了ucGUI里需要納入內(nèi)存管理的主要是窗體與字符串兩部分。每一個(gè)窗體與字符串都需要單獨(dú)的內(nèi)存塊(Block)來管理,他們在應(yīng)用層的句柄(Handle)即為內(nèi)存塊數(shù)組aBlock的索引值。

關(guān)于內(nèi)存塊結(jié)構(gòu)體的描述,根據(jù)其定義即可看出,Off為其在GUI_HEAP里偏移,Size為其大小,Next為下一個(gè)內(nèi)存塊的句柄,Prev為前一個(gè)內(nèi)存塊的句柄。可以看出ucGUI將所有的內(nèi)存塊做成的一個(gè)雙向鏈表。

內(nèi)存塊的最大個(gè)數(shù)由GUI_MAXBLOCKS來定義。定義如下:

#define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32)

即用GUI_ALLOC_SIZE通過計(jì)算得出。

下面我們來分析一下內(nèi)存塊結(jié)構(gòu)體tBlock的大小。先看一個(gè)GUI_ALLOC_DATATYPE和HANDLE的定義。

#ifGUI_ALLOC_SIZE <32767

? #define GUI_ALLOC_DATATYPE?? I16

? #define GUI_ALLOC_DATATYPE_U U16

#else

? #define GUI_ALLOC_DATATYPE?? I32

? #define GUI_ALLOC_DATATYPE_U U32

#endif

?

#ifGUI_MAXBLOCKS >= 256

? #define HANDLE U16

#else

? #define HANDLE U8

#endif

當(dāng)GUI_ALLOC_SIZE小于32kb時(shí)GUI_ALLOC_DATATYPE為兩個(gè)字節(jié),否則為4個(gè)字節(jié)。當(dāng)GUI_MAXBLOCKS大于等于256時(shí),HANDLE為兩個(gè)字節(jié),否則為1個(gè)字節(jié)。

所以,tBlock的大小最小為4字節(jié),最大為12字節(jié),實(shí)際上都和GUI_ALLOC_SIZE的大小相關(guān)。

4.??????ucGUI內(nèi)存管理的實(shí)現(xiàn)

對這部分不作過多的描述,因?yàn)楹蛯?nèi)存的使用的多少?zèng)]有太多關(guān)系。

需要說明的,ucGUI內(nèi)存管理主要是由上述的結(jié)構(gòu)體來管理。實(shí)現(xiàn)了在aBlock這塊內(nèi)存中,動(dòng)態(tài)分配和釋放,碎片整理等機(jī)制。經(jīng)過大量的實(shí)踐,可靠性與效率上還是有一定的保證。

5.??????總結(jié)

綜上所述。ucGUI需要的內(nèi)存大小主要由上面描述的GUI_HEAP和 tBlock決定。

舉個(gè)例子,當(dāng)我們GUI_ALLOC_SIZE將定于為1MB的大小。

ucGUI需要的內(nèi)存實(shí)際大小為:

GUI_ALLOC_SIZE+ sizeof(tBlock) * GUI_MAXBLOCKS? =

1mb + 12 * (2 + 1mb/32) = 1.375mb

總結(jié)

以上是生活随笔為你收集整理的ucGUI内存管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。