2017-04-13 107 views
12

llvm::SmallVector<T,N>实现被分割以及很多类型:为什么llvm :: SmallVector拆分其存储?

为什么是两个类模板之间的存储分裂,而不是具有最派生类(SmallVector<T,N>)简单地存储所有N元素和指针传递给该存储下来的基类?也就是说,在目前的默认构造函数:

SmallVector() : SmallVectorImpl<T>(N) { } 

一个假设的不同实现可以这样做:

SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { } 

SmallVectorTemplateCommon不会有FirstEl成员。目前实施的优势是什么?

+0

'SmallVector'并不总是很小,所以您需要一种方法来获取独立于'begin'的指向小存储的指针。这可以通过'&firstEl'方便地获得。 –

+0

@ T.C。你为什么需要它? – Barry

+0

如何判断矢量是否处于没有它的小模式(或一些等效信息)? –

回答

6

拆分存储可避免在“大小擦除”类型SmallVectorImpl中存储内联容量(或“很小”位)。

SmallVectorImpl<T>可用于引用任何SmallVector<T, N>并支持所有向量操作。当底层存储增长时,如果指针使用内联容量,则不能传递给free。将当前存储的地址与内联容量的第一个元素进行比较很方便,并且可以在SmallVector中节省一些内存。