我的主要目標是結合std::vector使用ompenMP,使一些并行計算。我想采用Z 玻色子的答案,其中每個執行緒都在自己的向量副本上作業,最后,我們std::copy從所有私有向量到全域向量。考慮這個例子:
#include<iostream>
#include <vector>
const int N = 10;
class foo {
public:
foo(int i) : heavy(i), ptr(nullptr) { }
foo() : heavy(0), ptr(nullptr) { } // needed by std::vector.resize()
const int heavy; // type is not assignable ...
foo * const ptr; // drop const to make it work
};
int main() {
std::vector<foo> tree;
tree.resize(N);
for (int i = 0; i < N; i = 2) {
std::vector<foo> vec_private;
vec_private.emplace_back(i );
vec_private.emplace_back(i 1);
std::copy(vec_private.begin(), vec_private.end(), tree.begin() i);
}
for (auto& x : tree)
std::cout << x.heavy << '\n';
return 0;
}
我有充分的理由將這些
consts留在foo課堂上。是否有任何方法可以保留它們而不會出現編譯時錯誤?是否可以使用移動語意來獲得更好的性能(并可能解決問題 1)?
據我所知, 的元素std::vector必須存盤為連續的記憶體塊,所以我不確定移動語意是否適用于此。
uj5u.com熱心網友回復:
不是呼叫resize然后復制分配你的元素,你可以reserve然后復制初始化它們:
std::vector<foo> tree;
tree.reserve(N);
for (int i = 0; i < N; i = 2) {
...
std::copy(vec_private.begin(), vec_private.end(), std::back_inserter(tree));
}
如果目標是讓每個執行緒并行地將自己的資料復制到預先分配的記憶體中,這將不起作用。在這種情況下,您的選擇是:
const從成員中洗掉- 一種相當務實的方法。使用未初始化的記憶體而不是向量:
foo *tree = (foo*)::operator new(sizeof(foo)*N); for (int i = 0; i < N; i = 2) { ... // then each thread can do: std::uninitialized_copy(vec_private.begin(), vec_private.end(), tree i); }使用這種方法,您需要正確呼叫解構式 (
tree[i].~foo()) 和解除分配 (::operator delete(tree))。但這會很棘手,因為您需要跟蹤哪些執行緒復制初始化了它們的元素,哪些沒有。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368080.html
