为什么 std::async 会复制它的 const 和参数?
Why does std::async copy its const & arguments?
我正试图通过使用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))
相关文章:
- 不允许运算符 const 参数调用 const 成员函数
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 将非 const 对象用于 const 参数
- 对可变参数模板使用 const 参数
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 为什么static_assert在带有 const 参数的成员函数中不起作用?
- 如何使用 QString::replace on const& 参数?
- 将const char * const参数成员分配给新值
- 默认移动构造函数采用 const 参数
- 模板参数包无法推断"const&"参数
- const参数与const引用参数
- 重载解析不正确,const 参数的值为 0
- 无法将带有 const 参数的函数转换为函数指针?
- const参数与C 模板中的非const参考结合
- 该函数更改成员函数的const参数
- 重载比较运算符 C++,如何与 const 参数进行比较
- 为什么 const 数组优先绑定到 const T& 参数而不是 T&& 参数?
- const参数的类的只读版本
- 为什么这个 const 参数不能与非类型模板参数匹配?
- 没有匹配函数调用具有 const 参数的模板化函数