1 概述
- 六大組件:容器、算法、迭代器、仿函數、配接器(adapter)、配置器(allocator)
- 仿函數:重載operator()
2 空間配置器 allocator
2.1 標準接口(P77)
-
allocator(): 雙層級配置器(採用哪種取決於__USE_MALLOC是否被定義)
1.1 大於128bytes,調用第一級配置器(__malloc_alloc_template)- 使用malloc和free,配置失敗時有相應的oom_malloc/oom_realloc,並可自定義out-of-memory handler
1.2 小於128bytes時,採用memory pool(__default_alloc_template)
-
維護16個free-lists(各自管理8,16,24,…,128bytes的區塊)
-
free-list node
union obj{ union obj *free_list_link; //指向區塊地址 char client_data[1]; }
-
大於128bytes則調用第一級配置器,找到free-list中最適當的一個。如果沒有可用的區塊,重新填充free-list(refill),並返回區塊;否則調整free-list並返回區塊(從free-list移除該區塊)
-
refill(size_t n) 使用chunk_alloc()取得新區塊(新的n個區塊爲連續),n爲8的整數
-
chunk_alloc(size_t n, int& nobjs) 如果剩餘空間(部分/完全)滿足需求則返回;否則,malloc(兩倍需求量+1/16的heap_size)。如果成功設置對應的start_free/end_free/heap_size;否則,先將剩餘空間給適當的free-list,然後從後面的free-list尋找未用區塊並設置對應的start_free/end_free,然後遞歸調用chunk_alloc()返回可用區塊,如果內存全用完,end_free=start_free=0,調用第一級配置器
-
deallocate()
- 大於128bytes則調用第一級配置器,尋找對應free_list,插入區塊
- construct()
- destroy()
- 包含兩種,一種接受指針,將指針所指對象析構掉;另一種接受兩個迭代器,將[first,last)間對象析構掉(只會對non trivial destructor進行析構調用)
- address()
- max_size()
- construct()
- destroy ()
2.1 內存基本處理工具
以下函數,要麼全構造,要麼全不構造
- uninitialized_copy(InputIterator first, InputIterator last, FowardIterator result)
- Pod類型調用stl copy(),否則調用construct(char和wchar使用特化版本,使用memmove)
- uninitialized_fill(FowardIterator first, FowardIterator last, const T& x)
- Pod類型調用stl fill(),否則調用construct
- uninitialized_fill_n(FowardIterator first, Size n, const T& x)
- 如果FowardIterator是Pod類型(用用trivial ctor/dtor/copy/assignment),交由高階函數fill_n()執行;否則調用construct