動態記憶體管理

記憶體池/arena 配置器

/ uh-REE-nuh /

呼叫 malloc 與 free 上千次——每個小物件一次——既慢又是洩漏與碎片的溫床。記憶體池,又稱 arena 或區域(region)配置器,是另一種策略:一開始就抓一大塊記憶體,然後自己從中發放小片,最後一次全部一起釋放。它以放棄逐物件的自由換取速度與簡單。

這裡是最簡單的形式,常稱為 bump 配置器。你 malloc 一大塊——比如 1 MiB——並保留一個指向其內部下一個空位的指標,從開頭起算。每次你需要一筆小配置時,就回傳目前位置、把指標往前推進所請求的大小。整個配置就這樣:不搜尋自由串列、沒有標頭、不合併——只是對一個指標做加法,這大概是記憶體管理能達到的最快速度。癥結在另一半:在純粹的 arena 中,你通常根本不釋放個別物件。反之,當你用完整批時——在一個請求、一個畫面或一次解析的尾端——你把指標重設回開頭(或釋放那一大塊),一次回收所有東西。這非常適合具有清楚生命期、許多物件一起建立又一起死去的工作型態:解析一份文件、處理一個網路請求、建構一個遊戲畫面。

為何重要:arena 消除了逐物件的 free 呼叫(所以你不可能忘記某個——在 arena 內沒有洩漏、沒有重複釋放、同批物件間沒有懸置指標),且它繞過碎片,因為一切都連續打包、一起釋放。代價是失去彈性:你無法輕易提早釋放一個物件而保留它的鄰居,而若你的物件不共享生命期,這個模型就不適用。arena 是最常見的一種自訂配置器,也是一個更廣概念的好例子:當你比通用配置器更了解自己的配置模式時,你可以在一次 malloc 之上建構自己的配置器。

char *arena = malloc(1 << 20); /* 一塊 1 MiB 區塊 */ size_t used = 0; /* bump 配置: */ void *p = arena + used; used += size; /* 不做逐物件釋放 */ /* ... 建立許多物件 ... */ free(arena); /* 一次回收一切 */

配置只是推進一個指標;整批在它們共享的生命期結束時一起釋放。

arena 以放棄釋放個別物件的能力換取速度與零碎片——它只在物件共享生命期、一起死去時適用。它不是 malloc/free 的通用替代品。

又稱
arena allocatorregion allocatorpool allocatorbump allocator記憶體池區域配置器