STL 空間配置器 allocator
STL的操作物件(所有的數值)都存放在容器之中,而容器則需要配置空間以置放資料。最近在看侯捷的《STL原始碼剖析》,所以做了筆記。
為什麼不說allocator是記憶體配置器而說他是空間配置器呢?
因為空間不一定是記憶體,空間也可以是磁碟或其他輔助儲存介質。
一般意義上理解:
- 物件構造的分解: 物件記憶體開闢allocator | 物件構造 construct
- 物件析構的分解: 物件記憶體釋放deallocate | 物件析構destroy
1.具備次配置力的SGI空間配置器
1.1 構造和析構:construct() 和 destroy()
/*構造construct*/
template <class T1, class T2>
inline void construct(T1* p, const T2& value)
{
/*將初值value設定到指標所指空間上*/
/*p是一塊已知記憶體*/
new (p) T1(value); // placement new 定位new
}
// destroy() 第1版本,接受1個指標。
template <class T>
inline void destroy(T* pointer)
{
pointer->~T(); // 呼叫dtor ~T()
}
// 以下是 destroy() 第2版本,接受兩個迭代器。此函式設法找出元素的數值型別,
// 進而利用 __type_traits<> 求取最適當措施。
template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {
__destroy(first, last, value_type(first));
}
// 判斷元素的數值型別( value type)是否有 trivial destructor
template <class ForwardIterator, class T>
inline void __destroy(ForwardIterator first, ForwardIterator last, T*)
{
typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
__destroy_aux(first, last, trivial_destructor());
}
// 如果元素的數值型別( value type)有 non-trivial destructor…
template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
for ( ; first < last; ++first)
destroy(&*first);
}
// 如果元素的數值型別( value type)有 trivial destructor…
template <class ForwardIterator>
inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}
// 以㆘是 destroy() 第㆓版本針對迭代器為 char* 和 wchar_t* 的特化版
inline void destroy(char*, char*) {}
inline void destroy(wchar_t*, wchar_t*) {}
相關推薦
STL空間配置器allocator詳解
stl六大元件簡介 我們知道,stl有容器,空間配置器,介面卡,迭代器,仿函式以及演算法這6個元件,它們六者關係大概如下:容器通過配置器取得資料儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成不同的策略變化,配接器可以修飾或套界仿函式。 侯捷在《STL原始
STL 空間配置器 allocator
STL的操作物件(所有的數值)都存放在容器之中,而容器則需要配置空間以置放資料。最近在看侯捷的《STL原始碼剖析》,所以做了筆記。 為什麼不說allocator是記憶體配置器而說他是空間配置器呢? 因為空間不一定是記憶體,空間也可以是磁碟或其他輔助儲存介質
C++STL 空間配置器allocator
先來介紹一下STL的六大元件1. 空間配置器:記憶體池實現小塊記憶體分配,對應到設計模式--單例模式(工具類,提供服務,一個程式只需要一個空間配置器即可),享元模式(小塊記憶體統一由記憶體池進行管理)2.迭代器:迭代器模式,模板方法3.容器:STL的核心之一,其他元件圍繞容器
STL學習筆記(1)空間配置器 allocator
1 簡述 STL其他元件都是存放在空間配置器配置的空間中,此處空間可以是記憶體,也可以是磁碟或其他輔助儲存介質。 allocator負責記憶體的分配和釋放,以及負責物件的構造和析構,兩個操作時分開的。 每個容器都已經制定了預設的空間配置器
C++ STL學習之 空間配置器(allocator)
標籤(空格分隔): C++ STL 眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空
【STL】SGI空間配置器 Allocator
//size此時已適當上調至8的倍數 template <bool threads, int inst> char* __default_alloc_template<threads, inst>::chunk_alloc(size_t size, int& nobjs) {
C++ 空間配置器(allocator)
name 碎片 inux set 特性 改變 ptr comm 二級 C++ 空間配置器(allocator) 在STL中,Memory Allocator 處於最底層的位置,為一切的 Container 提供存儲服務,是一切其他組件的基石。對於一般使用 STL 的用戶
[SGI STL]空間配置器--記憶體管理
[SGI STL]系列文章前言 廢話不多說,讀侯捷的SGI STL原始碼分析目的有三個: 1,接觸c++不久就開始跟STL打交道,一直有個好奇心,這麼強大的庫到底是誰、咋實現的?; 2,不熟悉實現就用不好STL,所以想更好的應用STL,就有必要一探其底層驅
STL空間配置器篇
零、為何STL要單獨設計空間配置器? 一開始我有過這樣的疑惑:為什麼STL不直接使用malloc和free操縱記憶體即可,為什麼還要設計空間配置器呢?這不是多此一舉嗎?後來在學習之後才明白這樣做是為了進一步提高記憶體的使用率和使用效率。主要是從以下兩方面來考慮的: 1.小
[C++] 空間配置器——allocator類
1、new和delete有一些靈活性上的侷限:new把記憶體分配和物件構造組合在了一起;delete將物件析構和記憶體釋放組合在了一起。 2、當分配一大塊記憶體時,我們通常計劃在這塊記憶體上按需構造物件,在此情況下,我們希望 將記憶體分配和物件構造分離;這意
STL-空間配置器剖析
網上有很多對於STL空間配置器原始碼的剖析,之所以這麼多人去剖析空間配置器,我覺得是真的設計的太好,而且剖析空間配置器的架構的設計對於C++學者來說是一個不錯的提高能力的專案,所以加入到這個解剖大軍中來。 參照了侯捷的《STL原始碼剖析》,原本
stl空間配置器簡介
1、 符合STL標準的空間配器介面 STL是c++中使用非常廣泛的一個標準庫,它包含各種有用的容器。而空間配置器作為STL各種容器的背後的核心,負責容器內部記憶體的分配和釋放。不過空間配置器可以分配的也不只是記憶體,因為空間也意味著可以是磁碟或者其他儲存介質。下邊是一個符合STL規範的空間配置器的必要介
SGI STL空間配置器-第一級空間配置器
一、SGI STL配置器簡介 如果要了解STL的實現,必須要了解空間配置器,因為整個STL的操作物件都放在容器之內,而容器一定需要配置空間以存放資料等資料。allocator叫做空間配置器而不是記憶體配置器,因為空間不一定是記憶體,也可以是磁碟或者其他
STL空間配置器剖析
根據情況來判定,如果配置區塊大於128bytes,說明“足夠大”,呼叫第一級配置器,而小於等於128bytes,則採用複雜記憶體池(memory pool)來管理。template <bool threads, int inst> class __default_alloc_template
STL——空間配置器
STL有6大元件:容器、演算法、迭代器、仿函式、配接器、分配器。它們之間的密切關係是STL的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋樑,演算法可以使用仿函式完成不同的策略
空間配置器——allocator
主要介紹一下allocator的用法一、為什麼要有allocator為什麼會有allocator?原因是new在記憶體分配上面有一些侷限性,new的機制是將記憶體分配和物件構造組合在一起,同樣的,del
STL空間配置器-第一級配置器
一、SGI STL配置器簡介 SGI STL的配置器與眾不同,它與標準規範不同。如果要在程式中明確使用SGI配置器,那麼應該這樣寫: vector<int,std::alloc>iv; 他的名字是alloc,而且不接受任何引數。標準配置器的名字是allocator,而且可以接受引數。
STL空間配置器、vector、list、deque、map復習
管理 其他 過程 prev 得到 大於 新元素 use 總量 本文寫於2017-03-03,從老賬號遷移到本賬號,原文地址:https://www.cnblogs.com/huangweiyang/p/6440830.html STL的六大組件:容器、算法、叠代器、空間配置
【STL深入學習】SGI STL空間配置器詳解(二)-第二級空間配置器
本文講解SGI STL空間配置器的第二級配置器。 相比第一級配置器,第二級配置器多了一些機制,避免小額區塊造成記憶體的碎片。不僅僅是碎片的問題,配置時的額外負擔也是一個大問題。因為區塊越小,額外負擔所佔的比例就越大。 額外負擔是指動態分配記憶體塊的時候,位於其頭部的額外資訊
[C++]STL-空間配置器(一)
空間配置器 從STL的實現來說,首先需要明白的就是空間配置器,因為整個STL的操作物件都放在容器中,而容器需要一定配置空間以置放資料。 空間配置器的標準介面 // 標準介面,一些typedef allocator::value_typ