2013-04-09 3 views
2

TBB Concurrent Vector мы можем динамически изменять размер с помощью grow_by и grow_to_at_least. И в STL Vector есть также функция изменения размера. Так в чем же разница?Разница между параллельным вектором TBB и вектором STL?

Разница, которую я наткнулся на это

1. concurrent_vector никогда не перемещает элемент до тех пор, пока массив не будет очищен, что может быть преимуществом над СТЛ станд :: вектор (который может перемещать элементы, чтобы изменить размер вектор), даже для однопоточного кода.

2. Используйте concurrent_vector только в том случае, если вам действительно необходимо динамически изменять его размер, в то время как другие виды доступа (или могут быть) в полете или если вам требуется, чтобы элемент никогда не двигался.

Может ли кто-нибудь объяснить эти моменты, поскольку я в замешательстве?

ответ

3

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

concurrent_vector, Я предполагаю, что, добавляет новые блоки памяти, но продолжает использовать старые. Недвижные объекты важны, так как позволяют другим потокам продолжать доступ к вектору, даже если он изменен. Вероятно, это также помогает с другими оптимизациями (например, сохранение сохраненных кешированных копий.) Недостатком является доступ к элементам немного медленнее, поскольку сначала необходимо найти правильный блок (один дополнительный знак).

Вот объяснение std :: векторное распределение памяти: How is dynamic memory managed in std::vector?

Смежные вопросы