STL 空間配置器

2021-08-17 15:04:54 字數 1475 閱讀 6220

stl的記憶體分配和釋放被詳細區分為四個部分:記憶體配置由allocate()負責(內部實現為operator new),記憶體釋放由deallocate()負責(內部實現為operator delete);物件構造由construct()負責(內部實現為placement new),物件析構操作由destroy()負責(內部實現為~t()【t為對應型別】)

operator new(),operator delete()這兩個全域性函式相當於c語言中的malloc()和free()。

destroy()第乙個版本接受乙個指標,將該指標所指之物析構即可,第二個版本接收兩個迭代器first、last,並逐一對範圍[first,last)內進行析構。

對於第二個版本,destroy()有很多特化和泛化版本,僅對於trivaial destructor按序執行destroy(),而對於一些特化版本,如char ,wchar ,non-trivaial destructor都不執行任何操作。

construct()只有乙個版本,就是使用placement new在operator new申請的空間上進行構造。

templatet *p;

const t2 &value

new(p) t(value); //new(指標) 型別(值)

sgi stl內部是雙層配置器,當配置區塊超過128b時,使用第一級配置器,使用malloc()和free()進行記憶體的配置,小於128b時,使用第二級配置器,使用記憶體池(擁有16個節點的鍊錶,節點大小為從[8,128]內8的倍數)進行記憶體分配,避免造成太多記憶體碎片。但是對上層,暴露的記憶體配置器為統一為alloc(內部使用條件編譯進行typedef(巨集為__use_malloc))。

一級空間配置器直接封裝malloc,free進行處理,增加了c++中的set_handler機制,增加記憶體分配時客戶端可選處理機制。二級空間配置由記憶體池以及夥伴系統:自由鍊錶組成

記憶體池空間何時釋放?

對於大於128的記憶體,客戶程式deallocate()之後會調free釋放掉,歸還給了系統。

記憶體池中獲取的空間呼叫deallocate()釋放後,並沒有還給系統,沒有在記憶體池,而在自由鍊錶中。程式中不曾釋放,且配置器的所有方法,成員都是靜態的,那麼他們就是存放在靜態區。釋放時機就是程式結束。

stl一共有五個全域性函式作用關於未初始化的空間之上。

除了之前說過的construct()和destroy(),還有三個函式uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n()。

這三個方法都能將記憶體的配置和物件的構造行為分開。對於pod型別(標量型別或c的struct型別,可以直接賦值),呼叫fill_n()函式進行初值填寫,對於非pod型別,採用construct()方法。

uninitialized_copy()針對char *和w_char *有專門的特化方法,呼叫memmove()進行快速複製。

STL 空間配置器

stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...

STL 空間配置器

stl空間配置器的底層原理 維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。源 pragma once using namespace std define throw bad alloc cerr out of memory endl ex...

STL空間配置器

一級空間配置器 ifndef malloc alloc template h define malloc alloc template h if 0 include define throw bad alloc throw bad alloc elif defined throw bad alloc...