Allocator分配器是STL的重要組件,負責為容器Container中的元素分配和釋放空間,前面也說過將Allocator獨立出來的好處就是可以實現不同的分配策略,因而可以根據需要使分配盡可能的最優化;而且這也使定制自己的分配器成為可能。
Allocator分配的空間不一定就是內存,你可以從任何可行的地方分配內存,比如磁盤。
二 Allocator的標准接口
為了給各種Container提供空間分配/釋放的能力,Allocator必須具有一組標准的接口,直接照搬列出了,全部死記這些對能力也不會有什麼提高,重要的是能夠自己根據需要實現一個Allocator就行了。
2.1 第一組
各種type類型,你可能會很奇怪,為什麼搞這麼復雜呢,剛開始時我也有同樣的疑惑;其實這個跟traits編程方法相關了,內容還不少,放到後面再說吧。
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference
typedef const T& const_reference
typedef size_t size_type
typedef ptrdiff_t difference_type
2.2 第二組
構造和析構函數
Allocator::Allocator()缺省構造函數
Allocator::Allocator(const Allocator&) copy構造函數
template <class U> Allocator::Allocator(const Allocator<U> &) 泛化的copy構造函數
Allocator::~Allocator() 缺省析構函數
還有一個rebind函數,llocator::rebind,一個nested class template,class rebind<U>有唯一的成員other,是一個typedef,代表Allcator<U>。
2.3 第三組
這是一組空間的釋放與回收函數
pointer Allocator::allocate(size_type n, const void* = 0)
配置空間,足以緩存n個對象,第二個參數是個提示,實際上可能會用來增進區域性(locality),或完全忽略之。
void Allocator::deallocate(pointer p, size_type n)歸還先前分配的空間
size_type Allocator::max_size() const 返回可分配的最大空間
2.4 第四組
一組取地址函數
pointer Allocator::address(reference x) const
返回x的地址,等同於&x
const_pointer Allocator::address(const_reference x) const
返回x的地址,等同於&x
2.5 第五組
construct和destroy函數
void Allocator::construct(pointer p, cosnt T&x)等同於new((const void*)p) T(x)
void Allocator::destroy(pointer p) 等同於p->~T()
Allocator可以非常簡單,簡單的執行內存分配和釋放即可,也可以非常復雜,像SGI的分配器;這個應該根據就事而論。
三 SGI分配器
順便提一下,SGI的分配器並沒有遵照STL標准,為了減少內存碎片和分配效率,SGI的分配器實現是相當復雜的,它提供了兩級分配器,對於大於128B的請求,采用第一級分配器,就是直接malloc,釋放就是直接free;小於128B的分配器則采用了第二級分配器;看到這一部分時,讓我想起了 Linux中的Slab分配器,專門針對小內存的分配策略,經常網上有人爭論內存碎片問題,應該是根據操作系統而異的,像Linux應該是不存在這樣的問題的,本身的小內存分配做的就是相當出色,這是題外話了。
先到這裡吧,畢竟Allocator的內容還是相當多的。