《STL原始碼剖析》 空間配置器(五)

2021-06-20 14:04:36 字數 3398 閱讀 1070

一、記憶體基本處理工具

stl定義有五個全域性函式,作用於未初始化空間上。前兩個函式是用於構造的 construct() 和用於析構的 destroy(),另三個函式 uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n(),分別對應於高層次函式 copy()、fill()、fill_n() —— 這些都是stl演算法。sgi把它們都定義於。

1. uninitialized_copy

// 如果 copy construction 等同於 assignment,而且 destructor 是 trivial,以下就有效

template inline forwarditerator

__uninitialized_copy_aux(inputiterator first, inputiterator last,

forwarditerator result,

__true_type)

template forwarditerator

__uninitialized_copy_aux(inputiterator first, inputiterator last,

forwarditerator result,

__false_type)

__stl_unwind(destroy(result, cur));

}// pod 意指 plain old data,也就是標量型別(scalar types)或傳統的 c struct 型別。

// pod 型別必然擁有 trivial ctor/dtor/copy/assignment函式。

template inline forwarditerator

__uninitialized_copy(inputiterator first, inputiterator last,

forwarditerator result, t*)

template inline forwarditerator

uninitialized_copy(inputiterator first, inputiterator last,

forwarditerator result)

// 針對 char * 和 wchar_t * 兩種型別,可以採用最具效率的做法 memmove(直接

// 移動記憶體內容)來執行複製行為

inline char* uninitialized_copy(const char* first, const char* last,

char* result)

inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last,

wchar_t* result)

uninitialized_copy() 使我們能夠將記憶體的配置與物件的構造行為分離開來。如果作為輸出目的地的 [result, result + (last - first)) 範圍內的每乙個迭代器都指向未初始化區域,則 uninitialized_copy() 會使用 copy constructor,給身為輸入**之 [first, last) 範圍內的每乙個物件產生乙份複製品,放進輸出範圍中。

c++標準規格書要求 uninitialized_copy() 具有 「commit  or rollback」 語意,意思是要麼「構造出所有必要元素」,要麼(當有任何乙個 copy constructor失敗時)「不構造任何東西」。

2. uninitialized_fill

template inline void

__uninitialized_fill_aux(forwarditerator first, forwarditerator last,

const t& x, __true_type)

template void

__uninitialized_fill_aux(forwarditerator first, forwarditerator last,

const t& x, __false_type)

__stl_unwind(destroy(first, cur));

}template inline void __uninitialized_fill(forwarditerator first, forwarditerator last,

const t& x, t1*)

template inline void uninitialized_fill(forwarditerator first, forwarditerator last,

const t& x)

uninitialized_fill() 也能夠使我們將記憶體配置與物件的構造行為分離開來。如果[first, last) 範圍內的每個迭代器都指向未初始話的記憶體,那麼uninitialized_fill() 會在該範圍內產生 x(上式第三個引數)的複製品。

與 uninitialized_copy() 一樣,uninitialized_fill() 必須具備 「commit or rollback」 語意。

3. uninitialized_fill_n

template inline forwarditerator

__uninitialized_fill_n_aux(forwarditerator first, size n,

const t& x, __true_type)

template forwarditerator

__uninitialized_fill_n_aux(forwarditerator first, size n,

const t& x, __false_type)

__stl_unwind(destroy(first, cur));

}template inline forwarditerator __uninitialized_fill_n(forwarditerator first, size n,

const t& x, t1*)

template inline forwarditerator uninitialized_fill_n(forwarditerator first, size n,

const t& x)

uninitialized_fill_n() 能夠使我們將記憶體配置與物件構造行為分離開來。它會為指定範圍內的所有元素設定相同的初值。如果 [ first, first + n) 範圍內的每乙個迭代器都指向未初始化的記憶體,那麼 uninitialized_fill_n() 會呼叫 copy constructor,在該範圍內產生 x(上式第三個引數)的複製品。

uninitialized_fill_n() 也具有 "commit  or  rollback"語意。

STL原始碼剖析 空間配置器

看過stl空間配置器的原始碼,總結一下 1 stl空間配置器 主要分三個檔案實現,stl construct.h 這裡定義了全域性函式construct 和destroy 負責物件的構造和析構。stl alloc.h檔案中定義了 一 二兩級配置器,彼此合作,配置器名為alloc.stl uninit...

STL原始碼剖析 空間配置器

allocator是空間配置器而不是記憶體配置器,空間不一定是記憶體,也可以是磁碟或其他輔助儲存介質。但sgi stl提供的配置器配置的物件是記憶體。sgi標準的空間配置器,std alloctor sgi定義了乙個符合部分標準,名為alloctor的配置器,效率不高,只把c 的 operator ...

STL原始碼剖析 空間配置器

由於物件的建立分為分配記憶體和呼叫建構函式兩部分,stl allocator使用alloc allocate 來分配記憶體,construct 構造物件。construct 函式只有乙個泛化的版本,destroy 函式有乙個泛化的針對迭代器的版本,destroy aux 根據是否需要呼叫析構函式進行...