聲明分析的代碼版本:
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 的分配器不可能這麼簡單,作爲初學者,只能簡要剖析一下目前所需要了解的東西。
在有能力之後,繼續深入剖析
最後引用侯捷大師一句話:
源碼之前,了無祕密