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

Why does std::async copy its const & arguments?

本文关键字:const 参数 复制 std async 为什么      更新时间:2023-10-16

我正试图通过使用std::async来加速程序。假设我有一个功能

T* f (const T& t1, const T& t2, const T& t3)

其中T是一种复制成本很高的类型。我有几个带有不同参数的f的独立调用,我试图用std::async将它们并行化,大致如下:(其中m_futures是正确类型的std::向量)。

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。

只存储引用是不安全的,因为没有什么可以保证不存在数据竞赛(更深刻的是,正如@utapistim在她不幸被删除的帖子中所说,对象的存在)。

如果你真的想要一个引用而不是副本,并且愿意把你的生命押在这一点上,那么你可以简单地使用引用包装器:

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