Mik*_*eMB 6 c++ concurrency c++11 ppl visual-studio-2013
我正在寻找将 aconcurrent_vector从 PPL 库转换为普通 std::vector 的推荐方法。
我有一个函数,它在 a 中返回其结果,std::vector但内部可能使用也可能不使用并行算法。目前我正在使用insert将元素从并发向量复制到法线向量:
#ifdef PARALLEL
std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;
//Fill cv in a parallel algorithm
std::vector<Foo> sv;
sv.insert(sv.begin(), cv.begin(), cv.end());
return sv;
}
#else
std::vector<Foo> Bar() {
std::vector<Foo> sv;
//Fill sv in a sequential algorithm
return sv;
}
#endif
Run Code Online (Sandbox Code Playgroud)
虽然插入操作的性能目前还不是一个真正的问题(与函数体相比),但它似乎没有必要,我想知道是否有更好的解决方案(顺便说一句:Foo是一个不能移动的简单 POD)。
理想情况下我想要有类似的东西
std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;
//Fill cv in a parallel algorithm
return static_cast<std::vector<Foo>>(cv);
}
Run Code Online (Sandbox Code Playgroud)
或者至少
std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;
//Fill cv in a parallel algorithm
std::vector<Foo> sv(std::move(cv));
return sv;
}
Run Code Online (Sandbox Code Playgroud)
关于如何正确执行此操作有什么建议吗?
编辑:
一如既往,我忽略了最明显的简化(克里斯建议):
std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;
//Fill cv in a parallel algorithm
return std::vector<Foo>(cv.begin(), cv.end());
}
Run Code Online (Sandbox Code Playgroud)
虽然它(很可能)没有删除副本,但它看起来更干净。
编辑2:
这导致我提出一个问题 - 假设没有办法显式阻止向量数据的副本 - 编译器有多大可能优化副本(从并发到 std::vector),同时仍然应用RVO或对函数返回值的移动操作
| 归档时间: |
|
| 查看次数: |
5743 次 |
| 最近记录: |