PointerUnion 類當前我知道用在 TinyPtrVector 中作爲底層數據存放。簡單說明一下。安全
定義在文件 llvm/include/llvm/[[ADT]]/[[PointerUnion.h]] 中。函數
== 概述 ==
實現聯合保存兩種不一樣的可區分類型的指針,將區分位保存在指針的最低位(NumLowBitsAvailable)。這種方式在空間上是極其節省的,但能夠使用很是天然和類型安全的 API。spa
This implements a discriminated union of two pointer types,
and keeps the discriminator bit-mangled into the low bits of the pointer.
This allows the implementation to be extremely efficient in space, but
permits a very natural and type-safe API.指針
參見:
* [[PointerUnionTypeSelectorReturn]]
* [[PointerUnionTypeSelector]]
* [[PointerUnionUIntTraits]]
* [[PointerIntPair]]ci
(注:對它們的描述略)rem
== 實現機理 ==
模板類 PointerUnion 概要以下:get
<syntaxhighlight lang="cpp">
template <PT1, PT2> class PointerUnion {
PointerIntPair<...> Val; // 注1
PointerUnion() // 多種構造函數,注2
isNull() -- 若是指針爲 null 則返回 true,和類型無關
is<PT1>(), is<PT2>() -- 返回 true 若是指針是類型 PT1, PT2
get<PT1>(), get<PT2>() -- 返回指針
// 其它函數略
}
</syntaxhighlight>it
* 注1: PointerIntPair<void*, 1, ...> 參見 [[PointerIntPair]],表示一個指針+1位的整數。
* 注2:當構造爲 PT1* 時,Val.int = 0;當指針爲 PT2* 時,Val.int = 1io
== 評述 ==
在一個 void* 空間中保存兩種類型的指針,以指針的低位 bit 來保存指針類型,看起來很麻煩。
用起來也要當心,用途很少的話,還不如不要這麼麻煩,多放一個字節來保存類型信息也很好的。模板
實現的 PointerUnion3, PointerUnion4 與此相似,都十分辛苦但沒有必要??
參見: * [[TinyPtrVector]]