研究了一下SGI STL的記憶體演算法
阿新 • • 發佈:2018-12-27
原理在STL原始碼剖析中已經有闡述,這裡簡單的說一下,該記憶體池採用HASH-LIST資料結構管理資料,分配一塊記憶體時,如果所要求的記憶體超過了某個數量就直接呼叫malloc分配記憶體, 否則首先進行資料對齊,根據這個對齊的結果得到所在的HASH表,在該HASH-LIST中查詢時候存在可用的節點,如果有就直接返回,否則每次以20個節點元素為數量開始增加LIST中的元素數量,如果仍然分配失敗了就去下一個HASH表中查詢可用記憶體,依次類推.
比如,這裡的實現對齊大小為512位元組,如果要求分配的記憶體不大於512位元組就自動調整為512位元組的資料大小,在512位元組的HASH-LIST中查詢可用節點.
程式碼和測試程式見附件,個人認為很巧妙,適合小物件的頻繁分配/釋放,效率比之單純的使用malloc/free提高了很多.
不知道還有哪些優秀的記憶體池實現演算法可以參考的?
BTW:這份程式碼不是我寫的,網上搜索所得,作者模擬了SGI STL的記憶體池演算法,我自己做了一些整理和註釋,向作者致敬.
另外,在我的機器上的測試結果為:
採用記憶體池:
real 0m10.723s
user 0m10.710s
sys 0m0.000s
採用系統的malloc/free:
real 0m12.969s
user 0m12.950s
sys 0m0.000s
點選 這裡下載程式碼.
比如,這裡的實現對齊大小為512位元組,如果要求分配的記憶體不大於512位元組就自動調整為512位元組的資料大小,在512位元組的HASH-LIST中查詢可用節點.
程式碼和測試程式見附件,個人認為很巧妙,適合小物件的頻繁分配/釋放,效率比之單純的使用malloc/free提高了很多.
不知道還有哪些優秀的記憶體池實現演算法可以參考的?
BTW:這份程式碼不是我寫的,網上搜索所得,作者模擬了SGI STL的記憶體池演算法,我自己做了一些整理和註釋,向作者致敬.
另外,在我的機器上的測試結果為:
採用記憶體池:
real 0m10.723s
user 0m10.710s
sys 0m0.000s
採用系統的malloc/free:
real 0m12.969s
user 0m12.950s
sys 0m0.000s
點選