天天看點

C++ STL 中的空間配置器 alloctor 學習筆記uy_allocator

uy_allocator

練習代碼: https://github.com/bobbymly/uy_allocator

引言
  • 使用空間配置器,而不是直接将所有的記憶體需求都直接向系統申請一塊記憶體的一個重要原因就是要盡量避免記憶體碎片。
  • 将所有的需求都通過向系統申請系統,不僅會帶來記憶體碎片的問題,配置時的額外負擔也是不可忽略的。
  • 第二級配置器可以通過一次申請一大塊記憶體,通過記憶體池和 free_list 來管理和負責小記憶體區塊配置設定,這樣在系統中的記憶體就不會被頻繁的分割并産生過多記憶體碎片以及配置時的額外負擔。

uy_allocator_1.h 第一級空間配置器

直接使用 malloc 從系統中申請記憶體空間

uy_allocator_2.h 第二級空間配置器

避免太多的小額區塊造成記憶體的碎片
  • 空間管理政策是
  • 當申請的空間夠大 (大于 128 bytes)時,直接交由第一級空間配置器處理
  • 當申請的空間較小 (小于 128 bytes)時,以 free_list 和記憶體池管理
  • 第二級空間配置器 使用一個 free_list 管理不同大小的記憶體塊(所有記憶體塊的管理與申請均提升為 8 bytes 的整數倍)
  • 當所申請的記憶體塊大小在 free_list 中有對應大小的剩餘記憶體塊可以使用時,直接從 free_list 中配置設定
  • 否則,從記憶體池中一次配置設定 20 個申請大小的記憶體塊,一個用于使用,19 個添加到 free_list 中備用
  • 當記憶體池中記憶體不足 20 個 申請的記憶體塊大小時
  • 若足夠一個則給與一個放回使用
  • 剩餘的小區塊記憶體直接添加到 free_list 中(充分利用)
  • 然後調用第一級空間擴充卡 向記憶體池中補充記憶體

process diagram

C++ STL 中的空間配置器 alloctor 學習筆記uy_allocator
C++ STL 中的空間配置器 alloctor 學習筆記uy_allocator