3

TBB Concurrent Vector 我们可以使用grow_by 和grow_to_at_least 动态调整大小。而在STL Vector 中也有调整大小的功能。那么有什么区别呢?

我遇到的不同是

1. concurrent_vector 在数组被清除之前永远不会移动元素,这可能是优于 STL std::vector(可以移动元素以调整向量大小)的优势,即使对于单线程代码也是如此。

2. 仅当您确实需要动态调整它的大小而其他访问正在(或可能)进行中,或者如果您要求元素永不移动时,才使用 concurrent_vector。

谁能解释这些观点,因为我对此感到困惑?

4

1 回答 1

4

我的意思是,一旦在 concurrent_vector 中分​​配了内存,它就会一直被使用,而 std::vector 在用完时分配两倍的内存并将存储的对象移动到新分配的块中。

我假设concurrent_vector正在添加新的内存块,但继续使用旧的。不移动对象很重要,因为它允许其他线程在重新调整大小时继续访问向量。它可能还有助于其他优化(例如保持缓存副本有效。)缺点是访问元素的速度稍慢,因为需要首先找到正确的块(额外的尊重。)

这是对 std::vector 内存分配的解释:如何在 std::vector 中管理动态内存?

于 2013-04-09T10:49:18.600 回答