這裡主要說的是具備次配置力的sgi空間配置器。
sgi stl的配置器與眾不同,也與標準規範不同,其名稱是
alloc
而不是allocator
,而且不接受任何引數。
比如:vector> iv; //此寫法錯誤
vectoriv;//此寫法正確
注意:sgi stl的每乙個容器都已經指定其預設的空間配置器為
alloc。
sgi stl也定義了乙個符合部分標準,名為
allocator
的配置器,但是
sgi從未使用過它,也不建議我們使用,主要是因為效率不佳,他只把
c++的
::operator new
和::operator delete
做一層薄薄的包裝而已。
下面我們要說的是sgi的特殊的空間配置器。
sgi特殊的空間配置器
----->std::alloc
我們所習慣的c++記憶體配置和記憶體釋放的操作是:
先配置記憶體,再構造物件。
先物件析構,再釋放記憶體。
在這裡,為了精密分工,所以決定將這個兩個階段操作區分開來處理。
記憶體配置操作由alloc::allocator()負責,記憶體釋放操作由
alloc::deallocator()
負責。
物件構造操作由::construct()負責,物件析構操作由
::destroy()
負責。
(就是將記憶體配置,釋放和物件構造,析構分開來進行)
配置器定義於
之中,而
sgi的
內包含以下兩個檔案:
#include //負責記憶體空間的配置與釋放
#include //負責物件內容的構造與析構
如下圖:
1.下面一起來看一下構造和析構基本工具:construct() 和
destroy()
以下是的部分內容:
#include template inline void construct(t1 * p,const t2& value)
/*placement new它用於在給定的記憶體中初始化物件(注意:此處是已經給定的記憶體)
placement new的呼叫方式是:new(p) t1(value); //(其中p是已經申請好的記憶體)
*///以下是destroy()第一版本,接受乙個指標
template inline void destroy(t* pointer)
//以下是destroy()第二版本,接受兩個迭代器,此函式設法找出元素的數值型別
//進而利用_type_traits<>求取最適當的措施
template inline void destroy(forwarditerator first,forwarditerator last)
//判斷元素的數值型別(value type)是否有trivial destructor
template inline void _destroy(forwarditerator first,forwarditerator last,t*)
//如果元素的數值型別(value type)有non_trivial destructor:
template inline void _destroy_aux(forwarditerator first,forwarditerator last,_false+type)
//以下是destroy()第二版本針對迭代器為char *和wchar_t*的特化版
inline void destroy(char *,char *){}
inline void destroy(wchar_t*,wchar_t*){}
由以上**我們可以知道:
(1)construct()函式接受乙個指標
p和乙個初值
value
,該函式的用途就是將初值設定到指標所指的空間上。
(所以此處用的是
c++中的
placement new)
(2)destroy()函式有兩個版本:
(a)第乙個版本接受乙個指標,準備將該指標所指的物件析構掉
(此處直接呼叫析構函式即可)。
(b)第二個版本是接受兩個迭代器
first
和last,
準備將[first
,last)
範圍內的所有物件析構掉,我們不知道這個範圍有多大,萬一很大,而每個物件的析構函式都無關痛癢,那麼一次次呼叫個這些無關痛癢的析構函式對效率是一種傷害。因此,這裡首先利用
value_type()
獲得迭代器所指物件的型別,再利用
_type_traits
判斷該型別的析構函式是否無關痛癢,若是
(_true_type)
,則什麼也不做就結束;若否
(_false_type)
,這才以迴圈方式巡防整個範圍,並在迴圈中每經歷乙個物件就呼叫第一版本的
注意:這兩個作為構造和析構之用的函式被設計為全域性函式,符合stl的規範。
stl還規定配置器必須擁有名為
construct()
和destroy()
的兩個成員函式。
(然而真正在sgi stl中大顯身手的
std::alloc
的配置器並未遵守這一規則)
STL 空間配置器
stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...
STL 空間配置器
stl空間配置器的底層原理 維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。源 pragma once using namespace std define throw bad alloc cerr out of memory endl ex...
STL空間配置器
一級空間配置器 ifndef malloc alloc template h define malloc alloc template h if 0 include define throw bad alloc throw bad alloc elif defined throw bad alloc...