[疑问]ucGui中内存碎片整理函数的一些不懂之处,望大虾指教?
这几天看了一天UCGUI的源码,不知道有没有朋友最这个感冒,对内存分配有几个疑问,望大虾指教。在该函数中:
static GUI_HMEM CreateHole(int Size) {
int i, iNext;
int r = -1;
for (i=0; (iNext =aBlock.Next) !=0; i= iNext) {
int NumFreeBytes = aBlock.Off- (aBlock.Off+aBlock.Size);
if (NumFreeBytes < Size) {
int NumBytesBeforeBlock = aBlock.Off - (aBlock.Off+aBlock.Size);
if (NumBytesBeforeBlock) {
U8* pData = &GUI_Heap.abHeap.Off];
memmove(pData-NumBytesBeforeBlock, pData, aBlock.Size);
aBlock.Off -=NumBytesBeforeBlock;
}
}
}
/* Check last block */
if (GUI_ALLOC_SIZE - (aBlock.Off+aBlock.Size) >= Size)
r = i;
return r;
}
在整理内存碎片的函数中是在整理完毕后,链表的最后添加的新的区域,疑问如下:
1:既然是为了得到Size的大小,为什么不在发现NumFreeBytes < Size 不成立的时候立即返回,添加在此区域?
2:当NumFreeBytes < Size 不成立时是不会整理该区域的,如是,是否会出现中间有大于 Size 的区域,但最后
GUI_ALLOC_SIZE - (aBlock.Off+aBlock.Size) 却小于 Size呢?
3:还一个小疑问是:int NumBytesBeforeBlock = aBlock.Off - (aBlock.Off+aBlock.Size);能否改为int NumBytesBeforeBlock = NumFreeBytes;或是不定义NumBytesBeforeBlock 而直接用NumFreeBytes?何苦定义一个新的变量?不知道是否会影响代码安全性? 沉的太快了,稍顶一下。 支持楼主
页:
[1]