为什么llvm :: SmallVector会拆分它的存储空间?

Bar*_*rry 13 c++ vector llvm

实现llvm::SmallVector<T,N>分为多种类型:

为什么存储在两个类模板之间拆分,而不是让派生的类(SmallVector<T,N>)只存储所有N元素并将指向这个存储的指针传递给基类?也就是说,默认构造函数当前执行的操作:

SmallVector() : SmallVectorImpl<T>(N) { }
Run Code Online (Sandbox Code Playgroud)

假设的不同实现可以做到:

SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }
Run Code Online (Sandbox Code Playgroud)

并且SmallVectorTemplateCommon不会有FirstEl会员.实施的优势是什么?

d0k*_*d0k 6

拆分存储避免了在"大小擦除"类型中存储内联容量(或"小"位)SmallVectorImpl.

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