我正在尝试通过使用 std::async 来加速程序。假设我有一个功能
T* f (const T& t1, const T& t2, const T& t3)
其中 T 是一种复制成本很高的类型。我有几个具有不同参数的 f 独立调用,我尝试将它们与 std::async 并行化,大致如下:(其中 m_futures 是正确类型的期货的 std::vector)。
for (...) {
m_futures.push_back (
std::async(
std::launch::async,
f,
a,b,c));
}
我观察到上面的代码减慢了我的程序的执行速度。我用 gdb 逐步完成了它,当创建未来时,T 的复制构造函数被调用了 3 次。这是为什么?参数 a,b,c 是堆分配的,但编译器可能不知道吗?我可以以某种方式使其明确吗?
std::async 创建参数的副本是否总是如此,即使它们应该通过 const 引用传递?我能以某种方式避免这种情况吗?在我天真的想法中,应该只传递一个指向函数的不同调用的指针(无论如何它只能从内存中读取。)如果这很重要,我在 Linux 上使用 gcc-4.6.3。