【C++內存管理】10_G2.9 std::alloc 源碼刨析

std::alloc 分兩級層進行內存管理,第一級在接下來的學習中是次要的,主要內容都集中在第二級裏。在 G4.9 版本中,第一級已被刪除

G2.9 中的一級內存管理

image.png

image.png

image.png

補充說明
  • class semple_alloc :應用層內存分配的基本單位是元素個數[ n] ,但底層實現中二級分配的單位是字節,此處便完成元素個數到字節數的轉換[ n * sizeof(T) ]

G2.9 中的二級內存管理【重點】

片斷一

image.png

補充說明
  • 圖片中僅保留了內存分配中最原汁原味的部分,其它內容已被剔除方便學習cookie

    • bool threads, int inst 僅保留接口,實現中已剔除
  • 實現中所有的成員函數和成員變量都是靜態的,所以很是容易擴展爲 C 版本
ROUND_UP : 將參數值「上調」整爲 8 的倍數(計算內存申請追加量會使用)

union obj *free_list_link : 嵌入式指針,鏈接可用內存塊

volatile : 多線程時使用,此處可暫忽略

free_list[_NFREELISTS] : 包含 16 個元素,每一個元素都是指針,指向自由鏈表

FREELIST_INDEX : 根據所用內存大小計算對應自由鏈表下標值(「上調」到8的倍數對應的下標值)

refill : 當自由鏈表爲空時調用

start_free、end_free : 指向戰備池

heap_size : 分配累計總量(關係到追加量)

片斷二

image.png

image.png

image.png

補充說明
  • deallocate :當內存塊小於 128 字節時,內存再沒法歸還給操做系統(free),自由鏈表將增加至高峯
  • 內存歸還難以實現:存在多條自由連鏈表且鏈表可能會很長,鏈表中的內存塊通過分配、歸還,已沒法高效的去判斷鏈表中的哪些內存塊是地址上是連續的(cookie)
  • 此種實現不算內存泄露,或許稱之爲」霸道「。會影響多任務系統中的其它進程
if (n > (size_t)__MAX_BYTES) : 超過 128 字節時使用一級內存管理(malloc、free)

片斷三

image.png

for(i=1; ;++i) : 循環從 1 開始,由於第 0 個內存塊返回給了客戶使用

片斷三

image.png

image.png

補充說明
  • 內存的補充永遠是補充到戰備池
start_free = (char*)malloc(bytes_to_get)
 
== 前一章模擬內存不足時的狀況就是改動的此處 ==>

start_free = (bytes_to_get + heap_size > 10000) ? 0 : (char*)malloc(bytes_to_get);

片斷四

image.png

相關文章
相關標籤/搜索