STL源碼剖析 閱讀(一)

1 概述

  • 六大組件:容器、算法、迭代器、仿函數、配接器(adapter)、配置器(allocator)
  • 仿函數:重載operator()

2 空間配置器 allocator

2.1 標準接口(P77)

  1. 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,調用第一級配置器

  2. deallocate()

  • 大於128bytes則調用第一級配置器,尋找對應free_list,插入區塊
  1. construct()
  2. destroy()
  • 包含兩種,一種接受指針,將指針所指對象析構掉;另一種接受兩個迭代器,將[first,last)間對象析構掉(只會對non trivial destructor進行析構調用)
  1. address()
  2. max_size()
  3. construct()
  4. destroy ()

2.1 內存基本處理工具

以下函數,要麼全構造,要麼全不構造

  1. uninitialized_copy(InputIterator first, InputIterator last, FowardIterator result)
  • Pod類型調用stl copy(),否則調用construct(char和wchar使用特化版本,使用memmove)
  1. uninitialized_fill(FowardIterator first, FowardIterator last, const T& x)
  • Pod類型調用stl fill(),否則調用construct
  1. uninitialized_fill_n(FowardIterator first, Size n, const T& x)
  • 如果FowardIterator是Pod類型(用用trivial ctor/dtor/copy/assignment),交由高階函數fill_n()執行;否則調用construct
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章