Реализация llvm::SmallVector<T,N>
разделяется между многими типами:
-
llvm::SmallVectorBase
содержит 3void*
для начала, конца и емкости. -
llvm::SmallVectorTemplateCommon<T>
содержит первый элемент небольшого хранилища, как соответствующий размерный и размерный массивchar
. -
llvm::SmallVector<T,N>
содержит следующие элементыN-1
для небольшого хранилища в виде массива подходящих выровненных и размерных массивовchar
.
Почему разделение хранилища между двумя шаблонами классов, в отличие от самого производного класса (SmallVector<T,N>
), просто хранит все элементы N
и передает указатели на это хранилище до базового класса? То есть, где в настоящее время конструктор по умолчанию делает:
SmallVector() : SmallVectorImpl<T>(N) { }
Возможна гипотетическая различная реализация:
SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }
и SmallVectorTemplateCommon
не будет иметь член FirstEl
. В чем преимущество реализации в ее нынешнем виде?