ucGUI内存管理
ucGUI內(nèi)存管理分析
1.??????概述
ucGUI為了提高在不同硬件與軟件平臺的可移植性,它的內(nèi)存分配沒有用到像molloc和free這樣的與平臺相關(guān)的函數(shù)。它有自己的一套機(jī)制來管理內(nèi)存。以下詳細(xì)描述其內(nèi)存管理機(jī)制。
2.??????ucGUI需要管理的內(nèi)存
a)????????窗體:
在ucGUI里,所有的控件(control),對話框(Dialog),框架窗體(Frame)實際都是由一個或多個窗體組成,這些窗體對應(yīng)用的層的表現(xiàn)形式為句柄(Handle),關(guān)于這個句柄的含義在下面講解。在ucGUI窗體管理機(jī)制里,每種不同的窗體都有其不同的結(jié)構(gòu)體。因此這些結(jié)構(gòu)體的實例均需要納入ucGUI的內(nèi)存管理。
b)????????字符串:
幾乎所有的窗體上都有多個字符串,這些字符串對應(yīng)用層的表現(xiàn)形式也為句柄。在ucGUI內(nèi)部實際是一個普通的字符串,也需要納入ucGUI的內(nèi)存管理。
3.??????ucGUI內(nèi)存管理分析
a)????????ucGUI定義了一個全局聯(lián)合體變量來存放他所需要的內(nèi)存。定義如下:
typedef union {
? int aintHeap[GUI_ALLOC_SIZE / 4];??
? U8?abHeap[GUI_ALLOC_SIZE];
} GUI_HEAP;
之所以這樣定義,是為單字節(jié)或四字節(jié)訪問的便利性。實際的大小即為宏定義GUI_ALLOC_SIZE的大小,這個宏定義可根據(jù)用戶實際使用情況來調(diào)節(jié)。實際上就是跟應(yīng)用的復(fù)雜度相關(guān)。換句話說,就是,實際應(yīng)用中,創(chuàng)建的窗體越多,界面上需要顯示的字符串越多,需要占用的內(nèi)存就越多。
b)????????ucGUI定義了一個全局的結(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)存管理的主要是窗體與字符串兩部分。每一個窗體與字符串都需要單獨(dú)的內(nèi)存塊(Block)來管理,他們在應(yīng)用層的句柄(Handle)即為內(nèi)存塊數(shù)組aBlock的索引值。
關(guān)于內(nèi)存塊結(jié)構(gòu)體的描述,根據(jù)其定義即可看出,Off為其在GUI_HEAP里偏移,Size為其大小,Next為下一個內(nèi)存塊的句柄,Prev為前一個內(nèi)存塊的句柄。可以看出ucGUI將所有的內(nèi)存塊做成的一個雙向鏈表。
內(nèi)存塊的最大個數(shù)由GUI_MAXBLOCKS來定義。定義如下:
#define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32)
即用GUI_ALLOC_SIZE通過計算得出。
下面我們來分析一下內(nèi)存塊結(jié)構(gòu)體tBlock的大小。先看一個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時GUI_ALLOC_DATATYPE為兩個字節(jié),否則為4個字節(jié)。當(dāng)GUI_MAXBLOCKS大于等于256時,HANDLE為兩個字節(jié),否則為1個字節(jié)。
所以,tBlock的大小最小為4字節(jié),最大為12字節(jié),實際上都和GUI_ALLOC_SIZE的大小相關(guān)。
4.??????ucGUI內(nèi)存管理的實現(xiàn)
對這部分不作過多的描述,因為和對內(nèi)存的使用的多少沒有太多關(guān)系。
需要說明的,ucGUI內(nèi)存管理主要是由上述的結(jié)構(gòu)體來管理。實現(xiàn)了在aBlock這塊內(nèi)存中,動態(tài)分配和釋放,碎片整理等機(jī)制。經(jīng)過大量的實踐,可靠性與效率上還是有一定的保證。
5.??????總結(jié)
綜上所述。ucGUI需要的內(nèi)存大小主要由上面描述的GUI_HEAP和 tBlock決定。
舉個例子,當(dāng)我們GUI_ALLOC_SIZE將定于為1MB的大小。
ucGUI需要的內(nèi)存實際大小為:
GUI_ALLOC_SIZE+ sizeof(tBlock) * GUI_MAXBLOCKS? =
1mb + 12 * (2 + 1mb/32) = 1.375mb
總結(jié)
- 上一篇: 什么季节买黄金更便宜?黄金购买时机分析
- 下一篇: wince编译