gpt4 book ai didi

c++ - 将 concurrent_vector 转换为 std::vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:30 24 4
gpt4 key购买 nike

我正在寻找将 PPL 库中的 concurrent_vector 转换为普通 std::vector 的推荐方法。

我有一个函数,它在 std::vector 中返回其结果,但可能在内部使用也可能不使用并行算法。目前我正在使用 insert 将元素从并发 vector 复制到法线 vector :

#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

虽然插入操作的性能目前不是真正的问题(与函数体相比),但似乎没有必要,我想知道是否有更好的解决方案(顺便说一句:Foo 是一个无法移动的简单 POD)。

理想情况下我想要类似的东西

std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;

//Fill cv in a parallel algorithm

return static_cast<std::vector<Foo>>(cv);
}

或至少

std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;

//Fill cv in a parallel algorithm

std::vector<Foo> sv(std::move(cv));
return sv;
}

关于如何正确执行此操作有什么建议吗?


编辑:
一如既往,我忽略了最明显的简化(克里斯建议):

std::vector<Foo> Bar() {
concurrency::concurrent_vector<Foo> cv;

//Fill cv in a parallel algorithm

return std::vector<Foo>(cv.begin(), cv.end());
}

虽然它(很可能)没有去除拷贝,但它看起来更干净了。

编辑2:

这让我想到了以下问题 - 假设没有办法明确阻止 vector 数据的拷贝 - 编译器有多大可能可以优化拷贝(从并发到 std::vector),同时仍然对函数的返回值应用 RVO 或移动操作

最佳答案

assuming there is no way to explicitly prevent a copy of the vector data - how likely it is that the compiler can optimize the copy (from concurrent to std::vector) away, while still applying RVO or a move operation on the functions' return value?

concurrent_vectorquite different来自 std::vector。特别是,它的数据存储在内存中不是连续的,正如 std::vector 所要求的那样。因此,您寻求的转换是不可能的,无论是显式转换还是作为编译器优化;数据需要从一个位置复制到另一个位置。

关于c++ - 将 concurrent_vector 转换为 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com