序號
0123
4567
891011
1213
1415
串接區塊816
2432
4048
5664
7280
8896
104112
120128
範圍1-8
9-16
17-24
25-32
33-40
41-48
49-56
57-64
65-72
73-80
81-88
89-96
97-104
105-112
113-120
121-128
幾個過程的思路:
一、申請過程:
code:
if(使用者申請的記憶體不大於128 bytes)
查詢對應的鍊錶
if(對應鍊錶擁有一塊以上的區塊)
調整鍊錶
返回第乙個區塊位址
else
準備重新填充鍊錶
向記憶體池申請記憶體(指定數量的區塊)
if(記憶體池申請到乙個區塊)
返回第乙個區塊位址
else
調整鍊錶,將區塊串接起來
返回第乙個區塊位址
else
直接用malloc()申請記憶體
二、釋放過程:
code:
if(使用者釋放的記憶體塊大於128 bytes)
直接用free()釋放
else
查詢對應的鍊錶
**記憶體
三、向記憶體池申請記憶體過程:
code:
if(記憶體池空間完全滿足需求量)
調整記憶體池起始位置
返回空間位址
else
if(記憶體池空間不能完全滿足需求量,但能提供乙個以上的區塊)
計算能夠提供的最大記憶體
調整記憶體池起始位置
返回空間位址
else
從記憶體池中壓縮記憶體
收集比size大的空間
遞迴呼叫,修正nobjs
再次申請記憶體,可能丟擲異常
stl記憶體池學習(一) 記憶體池初認識
序號 0123 4567 891011 1213 1415 串接區塊816 2432 4048 5664 7280 8896 104112 120128 範圍1 8 9 16 17 24 25 32 33 40 41 48 49 56 57 64 65 72 73 80 81 88 89 96 97...
stl記憶體池學習(二) 走近記憶體池
這一節學習基礎知識 所用到的資料結構。首先看記憶體池的介面 code ifndef mem pool h define mem pool h static size t freelist index size t bytes static size t round up size t bytes s...
STL記憶體池講解
簡單說下 設計記憶體池的目的主要是為了解決在一些特殊的場合 比如 網路程式設計時接受資料報 頻繁的建立和銷毀 造成的大量的記憶體碎片和降低效率。在stl的記憶體池中可以看到 它的實現是利用了乙個自由鍊錶陣列 obj free lists 陣列中每個元素都是乙個自由鍊錶的頭指標 它指向乙個由多個記憶體...