1. 程式人生 > >STL空間配置器篇

STL空間配置器篇

零、為何STL要單獨設計空間配置器?

一開始我有過這樣的疑惑:為什麼STL不直接使用malloc和free操縱記憶體即可,為什麼還要設計空間配置器呢?這不是多此一舉嗎?後來在學習之後才明白這樣做是為了進一步提高記憶體的使用率和使用效率。主要是從以下兩方面來考慮的:

1.小塊記憶體會帶來記憶體碎片問題

如果任由STL中的容器自行通過malloc分配記憶體,那麼頻繁的分配和釋放記憶體會導致堆中有很多的外部碎片。可能堆中的所有空閒空間之和很大,但當申請新的記憶體的請求到來時,沒有足夠大的連續記憶體可以分配,這將導致記憶體分配失敗。因此這樣會導致記憶體浪費。

2.小塊記憶體的頻繁申請釋放會帶來效能問題

開闢空間的時候,分配器需要時間去尋找空閒塊,找到空閒塊之後才能分配給使用者。而如果分配器找不到足夠大的空閒塊可能還需要考慮處理加碎片現象(釋放的小塊空間沒有合併),這時候需要花時間去合併已經釋放了的記憶體空間塊。而且malloc在開闢記憶體空間的時候,這些空間還會附帶附加的資訊,這些附加的額外資訊,如果頻繁申請小塊記憶體的話這些附加的資訊所帶來的記憶體負擔也會很大。

STL設計者為了解決這些問題,將STL(SGI版)的空間配置器分為兩級:一級空間配置器(__malloc_alloc_template)和二級空間配置器(__default_alloc_template)。在STL中如果你申請的記憶體大於128個位元組,那麼直接呼叫一級空間配置器向記憶體申請記憶體,如果你申請的記憶體小於等於128個位元組,將被認為是小記憶體,那麼將會呼叫二級空間配置器直接去記憶體池中申請。一級配置器和二級配置器的設計將在下面仔細講解。

一、STL中空間配置器的工作流程

二、一級空間配置器設計與實現

三、二級空間配置器設計與實現

四、本篇參考資料