今天來講昨天結尾說的兩個情況
這會有兩個情況:
就照字面意思,只要 free(chunk)
時,chunk 是 fastbin/smallbin ,就會優先放到
tcache 裡面,不過預設同樣 size 下最多只會存 7 個,換句話說
假設今天有 a1,a2,a3 ... a10 有這十個 fastbin 大小的 chunk ,則
free(a1)
free(a2)
free(a3)
free(a4)
free(a5)
free(a6)
free(a7)
free(a8)
free(a9)
free(a10)
這樣依序 free 下來時, a1 ~ a7 會放到 tcach 中,從 a8 開始會改放回 fastbin
變回本來的 heap 機制上
這邊先假設現在環境是剛剛上面第一個情況那樣,就是先 free 了 a1 ~ a10
那現在如果開始 malloc 7 次,這樣他會把 tcache 中存的 7 個都拿走
第八次 malloc 會取到 a10 (FILO) 且是從 fastbin 中取的,
那他取到 fastbin chunk 的當下,會同時檢查底下有沒有其他空閒的 chunk
所以會看到有 a8 和 a9 嘛,這時他就會把 a8 和 a9 放到 tcache 裡面
這裡要注意的是,因為是 FILO ,所以 fastbin 和 tcache 存的順序會顛倒
也就是本來在 fastbin 中應該是 a9 -> a8
存到 tcache 會變成 a8 -> a9
取出來的情況只有一個就是只要你 malloc 的 size 是 fastbin / smallbin 的,
都會優先從 TCache 中取,除非 TCache 中沒有,才會變回走本來的 heap 機制