我正在尝试使用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的复制构造函数被调用三次。这是为什么?参数a,b,c是堆分配的,但编译器可能不知道它?我能以某种方式明确表达吗?
std :: async是否始终创建参数的副本,即使它们应该由const引用传递?能以某种方式避免这种情况吗?在我天真的想法中,应该只有一个指针传递给函数的不同调用(无论如何只从内存中读取。)如果重要的话,我在Linux上使用gcc-4.6.3。
答案 0 :(得分:19)
仅存储引用是不安全的,因为没有任何东西可以保证数据竞争的缺失(更重要的是,仅仅存在对象,正如@utapistim在她遗憾地删除中所说的那样交)。
如果你真的想要一个参考而不是一个副本,你'愿意打赌你的生活是正确的,那么你可以简单地使用一个参考包装:
std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c))