程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Allocator空間分配器

Allocator空間分配器

編輯:關於C語言
 

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的內容還是相當多的。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved