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

2021-06-20 13:15:02 字數 1676 閱讀 1983

一。構造和析構基本工具:construct() 和 destroy()

#ifndef __sgi_stl_internal_construct_h

#define __sgi_stl_internal_construct_h

// 欲使用 placement new,需先包含此檔案

#include __stl_begin_namespace

// 以下是 destroy() 第一版本,接受乙個指標

template inline void destroy(t* pointer)

template inline void construct(t1* p, const t2& value)

// 如果元素的數值型別(value type)有 non-trivial destructor

template inline void

__destroy_aux(forwarditerator first, forwarditerator last, __false_type)

// 如果元素的數值型別(value type)有 trivial destructor

template inline void __destroy_aux(forwarditerator, forwarditerator, __true_type) {}

// 判斷元素的數值型別(value type)是否有 trivial destructor

template inline void __destroy(forwarditerator first, forwarditerator last, t*)

// 以下是 destroy() 第二版本,接受兩個迭代器。此函式設法找出元素的數值型別,

// 進而利用 __type_traits<> 求取最適當措施

template inline void destroy(forwarditerator first, forwarditerator last)

// 以下是 destroy() 第二版本針對迭代器為 char * 和 wchar_t * 的特化版

inline void destroy(char*, char*) {}

inline void destroy(wchar_t*, wchar_t*) {}

__stl_end_namespace

#endif /* __sgi_stl_internal_construct_h */

這兩個作為構造、析構之用的函式被設計為全域性函式。

上述 construct() 接受乙個指標 p 和乙個初值 value ,該函式的用途就是將初值設定到指標所指的空間上。c++ 的placement new 運算子可用來完成這一任務。

destroy() 有兩個版本,第乙個版本接受乙個指標,準備將該指標所指之物析構掉。這很簡單,直接呼叫該物件的析構函式即可。第二版本接受 first 和 last 兩個迭代器,準備將 [first, last) 範圍內的所有物件析構掉。

在第二個版本 destroy() 中,首先利用 value_type() 獲得迭代器所指物件的型別,在利用 __type_traits判斷該型別的析構函式是否無關痛癢。若是(__true_type) ,則什麼也不做就結束;若否(__false_type),這才以迴圈方式巡訪整個範圍,並在迴圈中每經歷乙個物件就呼叫第乙個版本的 destroy()。

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 根據是否需要呼叫析構函式進行...