【发布时间】:2020-04-10 08:17:51
【问题描述】:
我有一个用例来创建一个带有 许多 元素的std::vector,每个元素都是一个简单但非原始的类型(POD 结构)。向量和类型足够大/复杂,如下所示,
std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
resize 调用速度明显变慢。这很浪费,因为resize 默认初始化所有这些条目,然后我将循环执行并将它们全部设置为正确/有用的值。
我想做的是为向量分配所有内存,但不初始化任何条目,然后并行执行并初始化所有条目,例如使用 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] = ... 之类的东西。
有没有办法分配/“初始化”一个向量而不初始化它的任何元素,然后并行填充/初始化所有元素?
【问题讨论】:
-
如果你有 POD,那么默认 ctor 什么都不做,不是吗?
-
@SlavasupportsMonica 通常,矢量实现会在 POD 类型上调用
memset,虽然速度很快,但仍会产生一些成本。 -
如果你知道你需要的大小,为什么不使用老式的数组呢?
-
@Chipster,所以不要把它放在堆栈上。
auto v = std::make_shared<U[]>(1000000000) -
@Born2Smile,嗯,没错。但这不是唯一的问题。还有dynamically allocated and normal arrays will still default construct的问题,OP表示有兴趣不做。