學習 LLVM(6) TinyPtrVector 類

TinyPtrVector.h 位於 llvm/include/llvm/ADT/html

參見:http://llvm.org/docs/ProgrammersManual.html#dss_tinyptrvectorapi

== 簡介 ==
模板類 TinyPtrVector<Type> 是一個高度定製的集合類(微型指針向量容器),其優化爲當元素數量爲 0 或 1 的時候避免進行內存分配。它有兩個主要的限制:1) 只能容納指針類型;2)不能容納空指針。數組

因爲這個容器是高度定製的,因此不多使用。(檢索了一下彷佛有兩個地方用到)函數

TinyPtrVector<Type> is a highly specialized collection class that is optimized to avoid allocation in the case when a vector has zero or one elements. It has two major restrictions: 1) it can only hold values of pointer type, and 2) it cannot hold a null pointer.優化

Since this container is highly specialized, it is rarely used.this

== 實現機理 ==
模板類 TinyPtrVector 簡寫以下:指針

template <typename EltTy/*元素類型*/> class TinyPtrVector {
  PointerUnion<EltTy, Vector*> Val; // 注2。實際元素,或指向更大的容器的指針

  TinyPtrVector(), ~ // 構造與析構
  begin(), end(), empty(), size(), [] 等 STL 標準容器的函數。
  push_back(), front(), clear() 等方法。但沒有 pop 方法,接口比較小一些。
}

* 注1:在包含 "llvm/ADT/TinyPtrVector.h" 以前須要包含 "llvm/ADT/ArrayRef.h"
* 注2:Vector 指的是 SmallVector<EltTy, 4> 類型。當一個元素存不下的時候,使用 SmallVector 存放。rest

以 push_back() 爲例子研究:
* 若是 Val.isNull(),表示元素數量 == 0,此時使用 Val.PT1* 部分,設置爲 EltTy*。元素數量如今變成 1.
* 若是如今有 1 個元素使用 Val.PT1* 保存着,則 new 一個 Vector() 類型,將原有的那 1 個元素和如今要 push_back 的,都放在 Vector 中,而後將 Vector* 存放在 Val.PT2* 中。
* 不是以上兩種狀況,則如今用 Val.PT2* 保存着 Vector*,加入到該數組末尾。code

可能爲簡化 api,這個類沒有提供 pop_xxx(), push_front() 等接口。這樣也是合理的。htm

參見: * [[PointerUnion]]

相關文章
相關標籤/搜索