1. 程式人生 > >研究了一下SGI STL的記憶體演算法

研究了一下SGI STL的記憶體演算法

原理在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

點選
這裡
下載程式碼.