1. 程式人生 > >stl空間配置器簡介

stl空間配置器簡介

  1、 符合STL標準的空間配器介面

STL是c++中使用非常廣泛的一個標準庫,它包含各種有用的容器。而空間配置器作為STL各種容器的背後的核心,負責容器內部記憶體的分配和釋放。不過空間配置器可以分配的也不只是記憶體,因為空間也意味著可以是磁碟或者其他儲存介質。下邊是一個符合STL規範的空間配置器的必要介面:

allocator::value_type

allocator::pointer

allocator::const_pointer

allocator::reference

allocator::const_reference

allocator::size_type

allocator::difference_type

//上邊這幾個都是一些typedef定義,其中 size_type 和difference_type是stddef.h中 size_t, ptrdiff_t這兩個型別的類型別名(ptrdiff_t是兩個指標相減的結果)

allocator::rebind

allocator::allocator

allocator::allocator(const allocator&)

template<class U>

allocator::allocator(const allocator(U)&)

//泛化的拷貝建構函式

allocator::~allocator()

pointer allocator::address(reference X) const

const_pointer allocator::address(const_reference X)const

pointer allocator::allocator(size_type n, const void* = 0)

void allocator::deallocate(pointer p, size_type n)

//歸還先前配置的空間

size_type allocator::max_size() const

void allocator::construct(pointer p, const T& x)

void allocator::destrory(pointer p)

2、 SGI空間配置器

SGI STL的配置器與標準規範不同,其名稱是alloc而不是allocator,而且不接受任何引數。如果在程式中需要明確使用SGI的配置器,我們不能採用標準寫法:

vector<int, std::allocator<int> > v

需要這麼寫:

vector<int, std::alloc> v

通常情況下,我們使用的stl中的容器都是用標準配置器,而SGI STL的每一個容器都已經指定其預設空間配置器為alloc,如:

template <class T, class Alloc=alloc>

class vector {…}

2.1 標準空間配置器

SGI STL也有一個符合標準,名為allocator的配置器,但SGI從未使用過它,因為它效率太低,只是對::operator new, ::operator delete的簡單封裝而已;下邊我著重介紹SGI特殊的配置器alloc。

2.2 SGI特殊空間配置器, std::alloc

C++中,我們在申請記憶體和釋放記憶體的時候,一般這樣做:

class Foo{}

Foo* f = new Foo

delete f

這其中new操作符內部含有兩階段操作,(1)呼叫new申請記憶體, (2)呼叫Foo:Foo()即物件的建構函式構造物件內容。

delete也含有兩段操作:(1)呼叫Foo::~Foo()將物件析構, (2) 呼叫delete 釋放記憶體。

為了精密分工也更有效的利用記憶體,SGI alloc將這兩個階段分開來操作。記憶體配置有alloc::allocator()負責記憶體配置,alloc::deallocator()負責記憶體釋放;::constructor()負責構造物件;::destrory負責析構物件。

2.3記憶體配置後物件的構造與記憶體釋放前物件的析構工具: constructor()和destrory()

這兩個函式為全域性函式,符合stl規範。

constructor()接受一個指標p和一個初值,該函式的作用是將初值設定到指標所指的記憶體空間上

template<class T1, class T1>

inlie void destructor(T1 *p, const T2 &value) {

new (p) T1(value) //placement new 在一個已經分配的記憶體中建立物件

}

destroy()函式有兩個版本,一個版本接受一個指標引數,直接呼叫這個指標所指物件的解構函式析構物件。

template<class T>

inline void destroy(T* pointer){

pointer->~T();

}

另外一個版本接受兩個迭代器,

template<class ForwardIterator, class T>

inline void destroy(ForwardIterator first, ForwardIterator last, T*) {

}

destroy函式實現的有點複雜,他先獲取到迭代器所指物件的的型別,然後在看物件是否有trivial destructor, 如果有,呼叫一個什麼也不做的版本;如果有non-trivial destructor,則遍歷迭代器中的每一個物件,然後依次呼叫其解構函式。

(這裡主要是處於效率考慮, 如果一個物件的解構函式沒有任何作用,那麼迴圈呼叫這個函式對效率是一種傷害)。

備註:

        什麼是trivial destructor呢?舉個例子來說,存在A,B兩個類,其中類B含有一個數據成員C,C有解構函式需要釋放一些記憶體;那麼在這種情況下,A就含有trivial destructor, 而B則含有non-trivial destructor。

相關推薦

stl空間配置簡介

  1、 符合STL標準的空間配器介面 STL是c++中使用非常廣泛的一個標準庫,它包含各種有用的容器。而空間配置器作為STL各種容器的背後的核心,負責容器內部記憶體的分配和釋放。不過空間配置器可以分配的也不只是記憶體,因為空間也意味著可以是磁碟或者其他儲存介質。下邊是一個符合STL規範的空間配置器的必要介

[SGI STL]空間配置--記憶體管理

[SGI STL]系列文章前言        廢話不多說,讀侯捷的SGI STL原始碼分析目的有三個: 1,接觸c++不久就開始跟STL打交道,一直有個好奇心,這麼強大的庫到底是誰、咋實現的?; 2,不熟悉實現就用不好STL,所以想更好的應用STL,就有必要一探其底層驅

STL空間配置

零、為何STL要單獨設計空間配置器? 一開始我有過這樣的疑惑:為什麼STL不直接使用malloc和free操縱記憶體即可,為什麼還要設計空間配置器呢?這不是多此一舉嗎?後來在學習之後才明白這樣做是為了進一步提高記憶體的使用率和使用效率。主要是從以下兩方面來考慮的: 1.小

STL空間配置allocator詳解

stl六大元件簡介 我們知道,stl有容器,空間配置器,介面卡,迭代器,仿函式以及演算法這6個元件,它們六者關係大概如下:容器通過配置器取得資料儲存空間,演算法通過迭代器獲取容器內容,仿函式可以協助演算法完成不同的策略變化,配接器可以修飾或套界仿函式。 侯捷在《STL原始

STL-空間配置剖析

         網上有很多對於STL空間配置器原始碼的剖析,之所以這麼多人去剖析空間配置器,我覺得是真的設計的太好,而且剖析空間配置器的架構的設計對於C++學者來說是一個不錯的提高能力的專案,所以加入到這個解剖大軍中來。       參照了侯捷的《STL原始碼剖析》,原本

STL 空間配置 allocator

STL的操作物件(所有的數值)都存放在容器之中,而容器則需要配置空間以置放資料。最近在看侯捷的《STL原始碼剖析》,所以做了筆記。 為什麼不說allocator是記憶體配置器而說他是空間配置器呢? 因為空間不一定是記憶體,空間也可以是磁碟或其他輔助儲存介質

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的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋樑,演算法可以使用仿函式完成不同的策略

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

C++STL 空間配置allocator

先來介紹一下STL的六大元件1. 空間配置器:記憶體池實現小塊記憶體分配,對應到設計模式--單例模式(工具類,提供服務,一個程式只需要一個空間配置器即可),享元模式(小塊記憶體統一由記憶體池進行管理)2.迭代器:迭代器模式,模板方法3.容器:STL的核心之一,其他元件圍繞容器

SGI STL空間配置STL原始碼剖析)

空間配置器的標準介面(根據STL規範) allocator::value_typeallocator::pointerallocator::const_pointerallocator::referenceallocator::const_referencealloca

STL-空間配置、迭代、traits程式設計技巧

目錄 記憶體分配和釋放 物件的構造和析構 traits要解決的問題 內嵌類別宣告解決非指標迭代器的情況 使用模板特例化解決普通指標的情況 迭代器相應類別

C++標準庫——STL空間配置

但是 chunk 內容 既然 部分 如何 標識 stl源碼 strong 聲明:源碼同《STL源碼剖析》(侯捷) STL:   C++標準的模板庫,通用性高。   常見的數據結構封裝。   提供常用的通用算法。 STL六大組件:   容器 算法 叠

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

歡迎大家來訪二笙的小房子,一同學習分享生活! 文章目錄 1. 寫在前面 2. SGI空間配置器 2.1 SGI標準空間配置器 2.2 SGI特殊的空間配置器,std::alloc 2.3 構造和析構基本工具 2.4 空間

STL原始碼分析之空間配置

前言 SGI STL將new的申請空間和呼叫建構函式的兩個功能分開實現, 如果對new不太清楚的, 可以先去看看這一篇new實現再來看配置器也不遲. 本節是STL分析的第一篇, 主要分析STL各個部分都會出現的alloc實現, 雖然每個部分都只會預設呼叫它, 不瞭解它也可以看懂分析,

STL學習筆記(1)空間配置 allocator

1 簡述     STL其他元件都是存放在空間配置器配置的空間中,此處空間可以是記憶體,也可以是磁碟或其他輔助儲存介質。     allocator負責記憶體的分配和釋放,以及負責物件的構造和析構,兩個操作時分開的。     每個容器都已經制定了預設的空間配置器