huhong1230 发表于 2009-9-4 23:10:49

[疑问]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?何苦定义一个新的变量?不知道是否会影响代码安全性?

huhong1230 发表于 2009-9-18 00:39:00

沉的太快了,稍顶一下。

lcw_swust 发表于 2010-10-3 08:57:27

支持楼主
页: [1]
查看完整版本: [疑问]ucGui中内存碎片整理函数的一些不懂之处,望大虾指教?