为什么std :: async会复制它的const&参数呢?

时间:2013-02-13 10:17:14

标签: c++ gcc asynchronous c++11 std

我正在尝试使用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。

1 个答案:

答案 0 :(得分:19)

仅存储引用是不安全的,因为没有任何东西可以保证数据竞争的缺失(更重要的是,仅仅存在对象,正如@utapistim在她遗憾地删除中所说的那样交)。

如果你真的想要一个参考而不是一个副本,'愿意打赌你的生活是正确的,那么你可以简单地使用一个参考包装:

std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c))