SGI STL記憶體分配管理

2021-06-21 13:52:08 字數 743 閱讀 1970

大多數時候,分配記憶體一般是採用malloc或new,stl記憶體分配是怎麼樣的呢?

stl的記憶體採用的是:兩級記憶體配置方案。流程如下:

第一級記憶體方案,就是malloc(為什麼不用new?歷史原因 & c++不提供realloc方法,詳見這裡就不在贅述了,下面重點講下第二級記憶體池方案。

實際上,第二級記憶體方案可以簡單的認為是記憶體鍊錶。stl會維護乙個16個節點的陣列obj * free_list[16],如下圖:

陣列每個元素是乙個obj指標,obj的定義如下,採用的是union

union obj {

union obj* free_list_link;

char client_data[1];

這16個位置,每個下標指向一串指定大小的記憶體塊,塊內各記憶體通過指標組成乙個鍊錶,當申請30b的記憶體,會現將申請的大小對齊8的整數倍,如申請30b會返回32b,所以stl會從下標3指向的記憶體鍊錶中取出第乙個32b的小記憶體返回給呼叫方,並更新鍊錶指標。

綜上,stl的記憶體簡單分配方案可如上所以,實際上,關於分配,還有一些其他的邏輯,就不一一詳述了,比如當沒有32b的記憶體時,呼叫方申請10個32b的記憶體,則一次會

申請20個32b的記憶體鍊錶。

記憶體分配管理

系統中的記憶體分為棧 堆 全域性區 區 棧 由編譯器自動分配釋放,參訪函式的引數值,區域性變數,函式棧幀,函式呼叫過程。堆 由程式設計師自行分配想要的空間大小,c中的malloc等函式,c 中的new 全域性區 資料區 存放的是全域性變數和靜態變數,初始化的存在一起,未初始化的放一起,程式結束後由系...

SGI STL的記憶體池

tl中各種容器都有乙個可選的模板引數 allocator,也就是乙個負責記憶體分配的元件。stl標準規定的allcator 被定義在memory檔案中。stl標準規定的allocator只是單純地封裝operator new,效率上有點過意不去。sgi實現的stl裡,所有的容器都使用sgi自己定義的...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...