STL源碼剖析(一)---空間配置器

聲明分析的代碼版本:
GCC 2.95.3

前言

儘管在我們使用STL的時候,機會不怎麼使用空間配置器,但是空間配置器是STL中最重要的步,我們使用容器的時候,之所以不用管理內存,都是因爲有空間配置器。所以在剖析具體容器之前,先剖析空間配置器。

其他版本的配置器
vc6 使用的分配器:

vc6 下 new 調用allocator,allocator 調用 operator new,operator new 調用 malloc()

delete 調用 deallocate ,deallocate調用 operator delete, operator delete調用 free()

重點是 allocator 只是以 ::operator new 和 ::operator delete 完成 allocate() 和 deallocate(),沒有任何特殊設計,就是簡單的調用malloc() 和 free()
在這裏插入圖片描述
在這裏插入圖片描述

BC5.0

同上,相差不多。

GCC2.95.3

gcc 中的allocate 和 deallocate 的代碼和上面兩家的相差不多。–(有點尷尬)
在這裏插入圖片描述

但是

這個頭文件中包含了一句話
在這裏插入圖片描述
翻譯過來就是:

符合標準分配器有不同的接口,標準的默認分配器在 < memory > 這個頭文件

也就是說盡管 gc2.95.3 中有這個分配器,但是不去使用它,使用的是另一個版本。那麼另一個版本是什麼呢?

找個具體的容器看看它使用的是哪個分配器
在這裏插入圖片描述

從源代碼中可以看到,使用的是 __STL_DEFAULT_ALLOCATOR(_Tp)

繼續追蹤
在這裏插入圖片描述
追蹤到這裏發現,默認的分配器是這個。
而這裏的處理就和之前的分配器處理的不同。具體的好處在哪,這裏就不在贅述。之前有寫過一篇內存管理 來具體探討這裏的原因。

但是當我們換個版本來看看。 gcc-4.4.0
在這裏插入圖片描述
從源代碼可以看出**,這裏使用的不是2.95.3版本的分配器alloc,**這裏有使用之前的分配器(vc6,BC),至於爲什麼不適用更好的分配器–我也不清楚。

但是新的版本並沒有刪除之前的版本的代碼,如果你想使用之前的代碼,也是可以的。只不過將名字改了。 原來爲 alloc , 如今爲 __pool_alloc
例如:
vector<string,__gun_cxx::__pool_alloc> vec;

總結

當我們使用容器的時候,默認會調用分配器。而不同的分配器的性能也有所不同。
不同的版本的GCC默認調用的分配器也不同。

當然,stl 的分配器不可能這麼簡單,作爲初學者,只能簡要剖析一下目前所需要了解的東西。
在有能力之後,繼續深入剖析

最後引用侯捷大師一句話:

源碼之前,了無祕密

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章