一、記憶體基本處理工具
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 根據是否需要呼叫析構函式進行...