2

我有多个需要组合的大型 Intel TBB concurrent_vector。它们是如此之大,以至于无法分配足够大小的新 concurrent_vector。

...所以下面的伪代码不起作用

concurrent_vector<myStruct> A(100000);
concurrent_vector<myStruct> B(100000);
...
concurrent_vector<myStruct> X(100000);

concurrent_vector<myStruct> combined;
combined.resize(A.size()+B.size()....X.size()); // This will fail

我想做的是将第一组向量转移或交换到组合向量中,以便 [A]、[B]...[X] 变为 [AB...X]。我知道 tbb 支持单个向量的 swap(),但我看不到如何交换或附加多个向量。谁能指出我正确的方向?提前致谢!!

4

1 回答 1

4

不幸的是,没有这样一种方法可以将多个 concurrent_vector 组合成一个而不重新分配。它来自 tbb::concurrent_vector 严格的数据结构规则,其中每个元素段的大小必须与所有先前段的总和大小相同。

但请记住,concurrent_vector 会在没有重新分配的情况下增长,因此您能做的最好的事情就是一个接一个地附加向量,在复制后立即销毁它们。这样,就有更多机会在需要时释放足够大的内存块。

std::copy(B.begin(), B.end(), A.grow_by(B.size())); B.clear();
std::copy(C.begin(), C.end(), A.grow_by(C.size())); C.clear();
...
std::copy(X.begin(), X.end(), A.grow_by(X.size())); // X.clear();

但是,内存碎片会再次毁掉一切。

于 2014-04-01T09:38:10.377 回答