《STL原始碼剖析》學習筆記 空間配置

2021-09-30 10:32:49 字數 1188 閱讀 9195

相信大多數人應該和我一樣,對stl的認識是從使用它開始的。但是,這等利器都是雙刃劍,不明原理地使用,往往會適得其反。舉個例子來說,對vector進行增添或者刪除之後,出於記憶體安全的考慮,原有的迭代器應該摒棄不用。或許,只有真正走進stl的原始碼,才能解答這些疑問。 《stl原始碼剖析》這本書的原始碼來自大名鼎鼎的sgi stl,它是相對來說可讀性最高的乙個版本。

從實現的角度來看,空間配置器是一切的基礎。當我們使用各種容器,進行各種操作時, 空間配置器總是默默地在我們看不見的地方做出自己的貢獻。

sgi stl對記憶體的使用可以用兩個詞形容,可能不太準確:奢侈、精打細算。這一切都是為了:效率。下面是我的幾點拙見。

1、記憶體池(memory pool)的概念

在stl二級空間配置中,記憶體池的使用可謂奢侈。若在第一次使用時,你想要乙個8bytes區塊,stl會要得40個這樣的 8bytes區塊,其中乙個給你用,19個掛到free-list的一號桶下面,剩餘20個會放到記憶體池中,以供將來使用。這樣做的好處是,以後分配記憶體會直接從記憶體池中分配,提高了效率。

2、將記憶體分配和物件的構造/析構分開

template inline void construct (t1* p, const t2& value) 

template inline void destroy(t* pointer)

這裡只列出了第一種destroy方法,第二中可以析構掉一批物件。

這裡通過new佔位符,來進行單純的物件構造,只需要傳入之前分配好的記憶體池中的位址,就可以在它之上構造出t1物件。destroy方法只負責析構物件,記憶體不會同時被釋放掉。這樣做的好處是:可以避免進行頻繁的物件構造/析構時,記憶體也隨之不停地獲取和釋放,從而提高了速度。

3、聯合體的使用

在free-list中,使用了聯合體來實現其中的節點:

union obj
這種結構既可以連線下乙個節點,也可以為客端提供區塊。這種「一物二用」的思想這是節省到家了!

聯合體的另乙個傳神使用是:

struct in_addr s_un_b;

struct s_un_w;

u_long s_addr;

} s_un;

};

這種結構用被用於windows socket程式設計中,儲存ip。這樣做的好處不言而喻。

未完待續......

《STL原始碼剖析學習筆記》

1 演算法泛化過程 首先是模板 適應不同型別 其次是迭代器 具有原生指標行為的類 最後是仿函式 行為類似函式指標,但更適合泛化 泛化的優點 個人總結 1 簡化程式,提高 的可重用性 2 提高了程式的通用性 3 提高了程式的可讀性 4 提高了安全性 函式指標及仿函式 首先說說函式指標,乙個程式可能需要...

《STL原始碼剖析》學習筆記

第二章 空間配置器 allocator 考慮到小型區塊可能造成的記憶體破碎問題,sgi設計了雙層級配置器。當配置區塊超過128bytes時,便呼叫第一級配置器,即直接使用malloc free sgi的第一級配置器的allocate 和realloc 都是在呼叫malloc 和realloc 不成功...

STL原始碼剖析筆記

在stl中,迭代器使得容器與演算法分離開來,迭代器會定義五種型別。hash table是一種資料結構,和rb tree類似。其中set map multi set multi map都是基於rb tree。在stl中,patial sort 和nth element 不一樣。patial sort是...