源**提交到了csdn上,源**中總共提供了三種方法,一種是課程自帶的,一種是高分方法,還有一種是我自己融合前兩種方法寫的。
主要參考了這篇部落格寫的
這裡主要把課程自帶的方法和高分方法的思想主要說一下。
課程自帶的方法中使用了兩種方法,最基礎的一種是使用了隱式空閒列表+首次適配(遍歷尋找第乙個合適的空閒塊)的方法,得分最低,但也是最簡單的方法。
主要函式思路解析
mm_realloc中一般情況就是採用直接用mm_malloc函式開闢一塊大小為size的新空間,然後將原來ptr指標的內容直接複製過去。
mm_malloc中就是找到合適的空閒塊,並返回,其中找到合適空閒塊的函式find_fit就是遍歷整個可用棧空間,找到的第乙個合適的空閒區域就返回該指標。
coalesce是合併空閒塊,就是檢視當前塊前後是否有空閒塊,如果有就合併,在擴充套件完空閒塊以及釋放完空閒塊以後會呼叫
extend_heap擴充套件空閒塊
place將空閒塊改變為分配塊,如果有多餘的,就把剩下的變為空閒塊。
課程自帶的第二種方法大體上差不多,但是多了乙個rover指標,這個指標一般指向上一次操作被分配的塊上,在函式find_fit中,也就是下一次分配時,就是從rover指標處開始遍歷找尋合適的空閒塊,如果沒有,再從頭開始遍歷到rover指標處。這樣分配合適得多,因為每次擴充套件棧空間,都是擴充套件一大塊,然後在這個空間中切分空閒塊,所以上一次被分配的塊後面大概率有空閒塊。
高分方法是採用的顯式空閒列表+分離適配方法。
分離適配就是維護乙個空閒列表陣列,將陣列中每個元素分為...... 等等。根據空閒列表的大小,掛到對應的陣列下面去,並且每個陣列下面掛載的空閒塊是按有小到大的順序排列的。所以在這個程式中會多出兩個空閒塊鍊錶操作的函式。
主要函式思路解析(與課程函式不一樣的地方)
mm_realloc中不是直接分配size大小塊然後複製了,而是先檢視該ptr指向塊後面有沒有足夠的空閒塊,如果有就不需要複製,直接把後面的空閒塊拿來用即可,如果沒有再用mm_malloc分配塊然後複製過去的操作。
mm_malloc中找到合適空閒塊的方法是直接根據size找到對應的空閒列表陣列中的位置,然後在該位置處由小到大找到適合自己的空閒塊。
coalesce合併空閒塊的思想和課程一樣
extend_heap擴充套件空閒塊的思想也和課程的一樣
place中分配空閒塊運用一種方法來減少外部碎片,主要思想就是因為每次擴充套件空閒塊時都是採用一次擴充套件一大塊,然後慢慢切分的方式,所以在分配時根據所需size大小,設定乙個臨界值,如果大於這個臨界值就放後邊,小於這個臨界值就放前邊,大概思路就是把小的分配到一起,然後把大的也分配到一起。
具體細節可以檢視一下**和參考部落格
**理解中碰到的難點
1.注意在修改塊頭部的值的時候,整個塊的尺寸就會改變,所以在修改頭部資訊時,後面的巨集定義一定要小心
2.注意指標的使用,尤其是在高分方法中,pred_ptr和succ_ptr得到的是指向本塊中前驅和後繼指標存放位址的指標
3.高分方法中前驅指標和後繼指標指向的剛好和我方法中的相反,就我認為前驅指標指向尺寸小於等於自己的空閒塊,後繼指標指向尺寸大於等於自己的空閒塊,而高分方法相反
事件與委託要點
1 事件可以是靜態的 如 public static event mydelegate oneat 2 事件存在於類內,不能在類外宣告,因為事件是隸屬於乙個物件的,只能在類內宣告。3 事件是一種委託型別。4 委託可以在類內或類外宣告,宣告方式如下 public delegate string myd...
收貨與培訓練習之間的風馬牛關係
在買商品的過程中,正常人在交錢後,一定會把商品收到自己的手中,細心的人還會檢查一下是否有問題。請想一下,這是不是常識呢?可奇怪的是,學生在花了錢買教學服務後,收貨態度很不正常。經常有人不收貨,有人收貨不全。實際就是不願完成基本的作業要求。這樣的狀態,商品別人又用不上,對教學資源 有限的 形成嚴重的浪...
PLL原理與設計要點
pll就是phase locked loop,鎖相環。在許多場合,我們需要獲得乙個和輸入訊號或者載波同頻同相的本地訊號,這就要用到pll,它是當前頻率合成常用手段之一。其結構如下 pd是鑑相器,用於檢測兩個輸入訊號的相位差,有數字方式的也有模擬方式。模擬方式最好理解,設輸入訊號分別為cos wt a...