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]]