12
的llvm::SmallVector<T,N>
实现被分割以及很多类型:为什么llvm :: SmallVector拆分其存储?
llvm::SmallVectorBase
保持3个void*
S代表开始,结束和容量。llvm::SmallVectorTemplateCommon<T>
持有第一个元素的小型存储,作为一个适当的排列和大小排列的char
阵列。llvm::SmallVector<T,N>
拥有下一个N-1
元素的小型存储,作为一个阵列的适当排列和大小的阵列。
为什么是两个类模板之间的存储分裂,而不是具有最派生类(SmallVector<T,N>
)简单地存储所有N
元素和指针传递给该存储下来的基类?也就是说,在目前的默认构造函数:
SmallVector() : SmallVectorImpl<T>(N) { }
一个假设的不同实现可以这样做:
SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }
和SmallVectorTemplateCommon
不会有FirstEl
成员。目前实施的优势是什么?
'SmallVector'并不总是很小,所以您需要一种方法来获取独立于'begin'的指向小存储的指针。这可以通过'&firstEl'方便地获得。 –
@ T.C。你为什么需要它? – Barry
如何判断矢量是否处于没有它的小模式(或一些等效信息)? –