【发布时间】:2021-02-16 02:46:53
【问题描述】:
我有一个非常大的向量vector<T> t_vec。
我有一个类U,它实现了一个带有签名U(T x)的构造函数。
我可以使用两种方法创建vector<U> u_vec:
一)
vector<U> u_vec(t_vec.size());
std::transform(std::execution::parallel_policy,
t_vec.begin(),
t_vec.end(),
u_vec.begin(),
[](T& t) { return U(t); }
);
B)
vector<U> u_vec(t_vec.begin(), t_vec.end());
我应该期望方法 A) 比方法 B) 更占用内存吗?
【问题讨论】:
-
U是否也有默认构造函数和赋值运算符?方法 (A) 依赖于这些。 -
我不明白为什么 (A) 应该使用比 (B) 更多的内存。我想它可能会使用
O(1)额外内存,因为它可以同时处理多个临时U实例。 -
启动 threafs 确实需要额外的内存,如果只是为了堆栈空间。每个线程至少 4K,加上内核分配的其他线程数据。
-
@MichaëlRoy -- 这可能很重要,但通常,并行算法使用线程池,其中已经创建了线程。为并行算法动态创建线程会增加时间开销。
-
皮特贝克尔。我同意。但我们必须记住,线程池是按需创建的,最终在不使用时会超时。 @user89 如果这可能是一个问题,不时调用 async() 可以保持线程正常运行。
标签: c++ vector parallel-processing initialization c++-standard-library