1. 程式人生 > >c++ stl記憶體分配

c++ stl記憶體分配

STL原始碼剖析

SGI stl中stl 的記憶體分配不是採用allocator類,而是採用自己寫的類alloc
這個alloc類中主要有四個函式
construct : 用於呼叫新建類的建構函式,其實現就是依靠placement new
destroy : 用於呼叫新建類的解構函式
allocate : 用於分配新建類的記憶體,用operator new ,或者malloc
deallocate
new關鍵字就是先分配記憶體,再呼叫類的建構函式,而alloc類更加細分,把這兩部分分來,拆為allocate + construct
其實allocate()函式完全可以用operator new,或者malloc去實現,但是為了減少記憶體碎片,SGI STL採用了記憶體池

去實現。
SCG STL採用兩級配置器,這種方法稱為雙層級配置器。其實就是兩種方法。
第一級,即第一種方法,直接採用malloc()和free()。
第二級,即第二種方法,如果分配的區域大於128bytes,直接採用malloc,如果小於128 bytes 就是用記憶體池分配,以減少碎片。

第2級配置器說明

第二級方法示意圖如下:
這裡寫圖片描述
使用自由連結串列(free-list)技巧。主動將不論什麼小額區塊的記憶體需求量上調至8的倍數。如需求30,則上調至32。
free-list節點結構
union obj
{
union obj* free_list_link;
char client_data[];
};
有16個free-lists。各自管理大小分別為8、16、24、32、40、48、56、64、72、80、88、96、104、112、120、128 bytes的小額區塊。
這裡寫圖片描述


申請流程例如以下。
這裡寫圖片描述
釋放流程例如以下。
這裡寫圖片描述

現在linux下stl 記憶體分配狀況

這裡寫圖片描述
而allocator類中是通過allocate函式來實現分配記憶體的,而allocate函式實現如下:
這裡寫圖片描述
所以,STL已經拋棄了複雜的記憶體池方法,而改用簡單的new 方法實現stl 記憶體分配了。