2017-02-08 11 views
3

Я пытаюсь понять использование контейнера SmallVector в LLVM. Я думаю, std :: vector можно использовать в месте небольшого вектора. Также, что произойдет, если мы нажмем больше элементов в llvm :: SmallVector, чем его размер?В чем разница между std :: vector и LLVM :: SmallVector? какой из них использовать, когда?

+2

'std :: vector <>' is ... ** st ** andar ** d **. –

+1

Релевантный разговор: https://www.youtube.com/watch?v=vElZc6zSIXM –

ответ

5

llvm::SmallVector - вектор, оптимизированный для небольших массивов. Эта оптимизация возникает из-за нераспределения кучи для ограниченного числа элементов.

В случае добавления дополнительных элементов, которые, как описано, будут выделены с использованием автоматического хранилища, оно вернется к поведению std::vector и распределяет большие и большие массивы.

llvm::SmallVector<int, 10> smallVector; 
for(int i = 0; i < 10; i++) 
{ 
    smallVector.push_back(i); 
} 

// No heap allocations have been performed up to this point. 

smallVector.push_back(11); 

// Only 10 spaces for non heap allocated elements, 
// so the push_back above causes a heap allocation. 

SmallVector может иметь преимущество в производительности, когда вы знаете, что вы будете постоянно иметь небольшое количество элементов и не будете работать в ассигнования кучи. Это преимущество в производительности зависит от безопасности исключений и зависимости от библиотек llvm.

3

В чем разница между std :: vector и LLVM :: SmallVector?

Я предполагаю, что вы знакомы со стандартным вектором. llvm :: SmallVector описан в документации:

Это «вектор» (действительно, массив переменного размера), оптимизированный для случая, когда массив мал.

Он содержит некоторое количество элементов на месте, что позволяет избежать распределения кучи, когда фактическое количество элементов находится ниже этого порога. Это позволяет обычным «маленьким» случаям быть быстрыми, не теряя общности для больших входов.

Обратите внимание, что это не пытается быть безопасным для исключений.


который использовать, когда?

Использование станд :: вектор, когда:

  • Вы должны безопасность исключений ИЛИ
  • Вы не хотите дополнительных зависимостей, помимо стандартной библиотеки ИЛИ
  • Контейнер не является узким местом ИЛИ
  • Производительность даже не имеет значения ИЛИ
  • В любом случае вектор будет большим, поэтому оптимизация не повлияет

С помощью небольшой оптимизированной реализации (например, LLVM :: SmallVector, или другой реализации), когда

  • Ни один из вышеперечисленных не применяется

Кроме того, что произойдет, если мы нажимаем больше элементов в llvm :: SmallVector, чем его размер?

Когда исчерпан внутренний небольшой буфер, выделяется динамический буфер, и он будет вести себя как std::vector.

+0

@lax вы найдете обзор на [wikipedia] (https://en.wikipedia.org/wiki/Exception_safety) – user2079303