我有一个使用案例,需要创建一个 std::vector
,其中包含许多元素,每个元素都是一个简单但非原始类型(POD结构)。由于向量和类型足够大/复杂,在下面的情况中,...
std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
resize
调用明显缓慢。而且这种方式很浪费,因为 resize
会默认初始化所有的元素,然后我还需要在一个循环中遍历并将它们全部设置为正确/有用的值。
我希望做的是分配 vector 的所有内存空间,但不初始化任何元素,然后并行地遍历并初始化所有元素,例如使用 OpenMP。
std::vector<U> v;
v.reserve(1000000000);
#pragma omp parallel for
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
然而,
reserve
实际上并没有改变 v
的大小,所以我必须在循环中继续使用 push_back
,这将无法保持元素的正确顺序(在我的用例中很重要);我真的想在循环体中编写类似于 v[i] = ...
的代码。有没有一种方法可以分配/“初始化”一个向量,而不初始化任何元素,然后并行填充/初始化所有元素?
auto v = std::make_shared<U[]>(1000000000)
- Born2Smilenew
分配数据,以并行方式进行初始化(以获得首次触碰 NUMA 友好行为),然后按照 https://dev59.com/snE95IYBdhLWcg3wJKl_ 中所述将其转换为std::vector
。 - Jeff Hammond