STL空間配置器 一

2021-08-10 02:41:44 字數 2845 閱讀 5249

這裡主要說的是具備次配置力的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...