最近在看STL,寫一點博客。
關於一些細節可能就不放上來了,就寫一些我自己的心得。
1.爲什麼要用Allocator
C++容器的設計思路是,對存放到裏面的東西是拷貝一份放進去。
而且裏面的空間都是動態分配的。
所以在構建容器的時候,需要必要的①內存分配②構造對象。
2.new operator、operator new、placement new
(1)new operator
就是我們平時所使用的new/delete
new包含的,意思包括①分配內存②構造對象
(2)operator new
用來分配內存,相當於malloc
operator delete相當於free
(3)placement new
用來構造對象,需要給出指定的地址,以及傳遞給構造函數的參數
3.SGI STL的allocator
在侯捷剖析的STL中,有2個內存分配器
①std::allocator
這個是符合STL的allocator標準的分配器,實現就是採用的operator new 和 operator delete
②alloc
這個是當時的SGI STL自己所使用的默認內存分配器
分了兩層機制
第一層,分配128Bytes以上的,採用的是malloc和free來分配內存
第二層,分配128Bytes以下的,採用的是memory pool的概念
程序再使用二層的時候,直接向free_list申請內存,如果free_list不足,它再向memory pool申請
memory pool是一段很大的連續內存,而memory pool不足的情況下,再向heap malloc內存。
4.當前的GCC的實現
GCC是基於SGI實現的。
但是我現在所使用的GCC 4.9.2,的容器stl_vector、stl_list等都沒有使用alloc作爲默認的,而是直接使用std::allocator了。