std::alloc 分兩級層進行內存管理,第一級在接下來的學習中是次要的,主要內容都集中在第二級裏。在 G4.9 版本中,第一級已被刪除
補充說明
class semple_alloc
:應用層內存分配的基本單位是元素個數[ n] ,但底層實現中二級分配的單位是字節,此處便完成元素個數到字節數的轉換[ n * sizeof(T) ]補充說明
圖片中僅保留了內存分配中最原汁原味的部分,其它內容已被剔除方便學習cookie
bool threads, int inst
僅保留接口,實現中已剔除ROUND_UP : 將參數值「上調」整爲 8 的倍數(計算內存申請追加量會使用) union obj *free_list_link : 嵌入式指針,鏈接可用內存塊 volatile : 多線程時使用,此處可暫忽略 free_list[_NFREELISTS] : 包含 16 個元素,每一個元素都是指針,指向自由鏈表 FREELIST_INDEX : 根據所用內存大小計算對應自由鏈表下標值(「上調」到8的倍數對應的下標值) refill : 當自由鏈表爲空時調用 start_free、end_free : 指向戰備池 heap_size : 分配累計總量(關係到追加量)
補充說明
if (n > (size_t)__MAX_BYTES) : 超過 128 字節時使用一級內存管理(malloc、free)
for(i=1; ;++i) : 循環從 1 開始,由於第 0 個內存塊返回給了客戶使用
補充說明
start_free = (char*)malloc(bytes_to_get) == 前一章模擬內存不足時的狀況就是改動的此處 ==> start_free = (bytes_to_get + heap_size > 10000) ? 0 : (char*)malloc(bytes_to_get);