• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-91  評(píng)論-137  文章-0  trackbacks-0

            我們知道對(duì)于一個(gè)數(shù)據(jù)堆,有申請(qǐng)內(nèi)存塊,釋放內(nèi)存塊等操作.

            應(yīng)此我們給出3個(gè)數(shù)組,分別為內(nèi)存堆,標(biāo)記數(shù)組,使用是否數(shù)組和一個(gè)變量用于表示內(nèi)存堆內(nèi)剩余空間數(shù).
            1     CHAR HeapData[HEAP_LENGTH];
            2     CHAR HeapApplyed[HEAP_LENGTH];
            3     CHAR HeapUsed[HEAP_LENGTH];
            4 
            5     int HeapLeft;                            // 剩余Heap大小
            初始化時(shí)將3個(gè)數(shù)組全部設(shè)為0.
            1         memset(HeapData,0,HEAP_LENGTH);
            2         memset(HeapApplyed,0,HEAP_LENGTH);
            3         memset(HeapUsed,0,HEAP_LENGTH);
            然后我們需要一個(gè)New操作來(lái)申請(qǐng)一塊尚未使用的內(nèi)存塊.
             1     CHAR* New(const int Size)
             2     {
             3         if(Size > HeapLeft) throw HEAP_OVERFLOW;
             4         int iEmpty = GetEmptyLeft(Size);
             5 
             6         memset(HeapApplyed + iEmpty,1,Size); // 將內(nèi)存塊標(biāo)記
             7 
             8         HeapLeft -= Size;
             9         return HeapData + iEmpty;
            10     }
            一個(gè)Free操作來(lái)釋放一個(gè)內(nèi)存塊.
            1     BOOL Free(const int Offset,const int Size)
            2     {
            3         if(!Apply(Offset,Size)) throw HEAP_NOTAPPLY;
            4         memset(HeapApplyed + Offset,0,Size);    // 設(shè)置為未標(biāo)記
            5         memset(HeapUsed + Offset,0,Size);        // 標(biāo)記為未使用
            6         HeapLeft += Size;
            7         return TRUE;
            8     }
            一個(gè)GetEmptyAddr操作來(lái)獲得第一個(gè)符合指定大小的空閑內(nèi)存卡塊.
             1     CHAR* GetEmptyAddr(const int Size)
             2     {
             3         for(int i=0;i<HEAP_LENGTH;i++)
             4             if(HeapApplyed[i] && !HeapUsed[i]) // 已標(biāo)記并未使用
             5             {
             6                 BOOL bContinue = FALSE;
             7                 for(int j=i;j<Size;j++)
             8                     if(!HeapApplyed[j] || HeapUsed[j]) // 未標(biāo)記或已使用
             9                     {
            10                         bContinue = TRUE;
            11                         break;
            12                     }
            13                 if(bContinue) continue;
            14                 return HeapData + i;
            15             }
            16         return 0;
            17     }
            和一個(gè)SetData操作來(lái)設(shè)置數(shù)據(jù).
            1     BOOL SetData(const int Offset,const Type* Data,const int Size)
            2     {
            3         if(!Apply(Offset,Size)) throw HEAP_NOTAPPLY;
            4         memcpy(HeapData + Offset,Data,Size);    // 拷貝數(shù)據(jù)
            5         memset(HeapUsed + Offset,1,Size);        // 標(biāo)記為已使用
            6         return TRUE;
            7     }
            最后我們來(lái)測(cè)試一下這個(gè)堆結(jié)構(gòu).
             1     try
             2     {
             3         Heap<CHAR> heap;
             4         heap.New(9000);
             5 
             6         int i = 1000;
             7         heap.Free(0,100);
             8         printf("EmptyAddr:%X\n",heap.GetEmptyAddr(sizeof(int)));
             9 
            10         int* Addr1 = (int*)heap.GetEmptyAddr(sizeof(int));
            11         heap.SetData((CHAR*)Addr1 - *heap,(CHAR*)&i,sizeof(int));
            12 
            13         printf("The Data In Heap:%d\n",*Addr1);
            14 
            15         heap.New(100);
            16         printf("EmptyAddr:%X\n",heap.GetEmptyAddr(sizeof(int)));
            17 
            18         CHAR str[] = "aaaaa";
            19         CHAR* Addr2 = heap.GetEmptyAddr(strlen(str));
            20         heap.SetData(Addr2 - *heap,str,strlen(str));
            21 
            22         printf("The Data In Heap:%s\n",Addr2);
            23 
            24         printf("EmptyAddr:%X\n",heap.GetEmptyAddr(sizeof(int)));
            25     }
            26     catch(int i)
            27     {
            28         switch(i)
            29         {
            30         case HEAP_OVERFLOW:
            31             printf("堆溢出\n");
            32             break;
            33         case HEAP_NOTAPPLY:
            34             printf("錯(cuò)誤的地址\n");
            35             break;
            36         }
            37     }
            測(cè)試結(jié)果:
            1 EmptyAddr:4EFB0
            2 The Data In Heap:1000
            3 EmptyAddr:4EF4C
            4 The Data In Heap:aaaaa
            5 EmptyAddr:4EF51

            下面給出完整代碼
            posted on 2011-02-15 20:59 lwch 閱讀(2076) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)

            評(píng)論:
            # re: 簡(jiǎn)單的堆結(jié)構(gòu)實(shí)現(xiàn) 2011-02-16 09:31 | 戰(zhàn)魂小筑
            GetEmptyAddr用for也太慢了吧,改成堆棧好些  回復(fù)  更多評(píng)論
              
            # re: 簡(jiǎn)單的堆結(jié)構(gòu)實(shí)現(xiàn) 2011-02-17 13:20 | 淘寶皇冠店
            # re: 簡(jiǎn)單的堆結(jié)構(gòu)實(shí)現(xiàn) 2013-05-03 15:57 | tb
            拿來(lái)練手一下  回復(fù)  更多評(píng)論
              
            久久午夜免费视频| 日韩欧美亚洲综合久久影院Ds| 一本久久a久久精品亚洲| 久久精品国产亚洲AV无码麻豆 | 亚洲狠狠久久综合一区77777| 国产成人精品久久| 久久精品一区二区三区AV| 久久国产精品成人片免费| 久久综合成人网| 久久美女网站免费| 久久精品综合网| 99久久精品免费看国产免费| 久久精品国产男包| 久久久久无码精品| 国产精品99久久99久久久| 色99久久久久高潮综合影院| 91精品国产91久久久久福利| 久久精品成人欧美大片| 久久本道综合久久伊人| 国产高潮国产高潮久久久| 久久精品国产乱子伦| 久久久久国产成人精品亚洲午夜| 久久国产热精品波多野结衣AV| 综合久久给合久久狠狠狠97色 | 久久亚洲国产精品一区二区| 久久综合九色综合网站| 国产AⅤ精品一区二区三区久久| 97久久超碰国产精品2021| 久久综合亚洲欧美成人| 国产精品久久新婚兰兰| 久久综合久久鬼色| 亚洲国产精品成人AV无码久久综合影院| 俺来也俺去啦久久综合网| 亚洲欧美日韩久久精品第一区| 欧美午夜A∨大片久久 | 狠狠色丁香久久婷婷综合| 久久综合色老色| 精品久久久久成人码免费动漫| 综合久久给合久久狠狠狠97色| 狠狠色丁香久久婷婷综合图片| 久久久午夜精品|