視頻請看 : http://edu.csdn.net/course/detail/627
1.內存池的目的
提高程序的效率
減少運行時間
避免內存碎片
2.原理
要解決上述兩個問題,最好的方法就是內存池技術。具體方法就是,申請內存 :大小固定,提前申請,重復利用。
3.使用場合
長時間運行的服務程序
對速度要求高的程序
對穩定性要求高的程序
4.內存池不能滿足所有的需求
內存池是不能夠滿足所有人的需求的,那么考慮到通用性,健壯性,需要考慮到,當申請內存塊 大小不在內存池 中的情況
或者內存池中已經沒有內存塊了,所采取的措施:直接使用系統的申請,釋放函數。
內存池的設計 :
內存池中有很多內存塊,內存池中有很多鏈表,每一個鏈表中存儲一種固定大小的內存塊,例如128字節鏈表中存儲的是大小都為
128字節的內存塊,依次類推,內存池中維護了很多個這樣的鏈表。
這里我們要解決的第一個問題是,當我們申請內存是,首先要找到對應大小的鏈表,如果設計可以避免這個查找過程。
從內存鏈表中申請內存過程中,不需要查找,直接返回可用內存(鏈表可輕松實現)
解釋釋放內存的時候,如何快速的把內存塊放回到對應的鏈表中
下面針對上述問題做依次設計:

首先在數據結構上進行申請的研究:
為了能滿足上面的申請,釋放可以快讀定位到鏈表,我們需要維護額外的數據結構才可以達到目標,思路如下:

在申請內存的時候需要多申請一部分作為系統使用,系統使用的內存結構中,包含了該內存塊所屬的內存鏈表指針,這樣就可以
快速度的釋放內存。
有了這個特殊的結構設計以后,我們就可以不通過查找定位到內存上。
看下面的圖:

首先考慮我們申請內存的過程:
char* p = new char[100];
實際上我們給出的輸入數據就是 100個字節的數據,如果我可以 MemeoryList* p = _listIndex[100];
這樣就可以直接的定位到對應的鏈表了。
如何結合 CPU-cache實現更加高度的內存池呢 ?