c++ - 为什么 std::thread 通过转发引用接受仿函数

标签 c++ multithreading c++11 c++14 forwarding-reference

为什么 std::thread 对象通过转发引用接受函数参数,然后使用 decay_copy 复制对象?只按值接受函数对象不是更容易吗?

一般来说,为什么不对函数进行模板化以便按值获取函数对象?引用性不能用 reference_wrapper 来模仿吗(这会更明确,并且还方便地有一个成员 operator() 来调用存储的函数)?

最佳答案

Why does a std::thread object accept the function parameter by forwarding reference and then make a copy of the object with decay_copy? Wouldn't it be easier to just accept the function object by value?

它必须在存储中有一个函数对象的拷贝,只要它即将启动的线程持续存在,它就可以保证持续存在。

构造 std::thread 的函数参数不会持续那么久,因为创建 std::thread 的行可以在创建的线程结束之前很久结束.

所以它必须复制一份。如果它按值获取参数,它会在调用构造函数时制作一个拷贝,然后必须制作另一个拷贝到持久存储。通过转发引用获取它,它可以完全复制一个拷贝。

现在可以移动这个额外的拷贝,使额外的开销成为一个额外的移动。这仍然是额外的开销,因为并非所有结构的移动成本都很低。

In general why would one not template a function so as to take a function object by value?

因为这需要额外的移动

Can reference-ness not be imitated with reference_wrappers (which would be more explicit, and also conveniently has a member operator() to call the stored function)?

在您打算存储函数对象的情况下,通过转发引用获取可以节省一步,并且不需要函数对象获取代码的编写者做太多额外的工作。

如果调用者传入引用包装器,则存储的值将是引用包装器,这具有不同的含义。

关于c++ - 为什么 std::thread 通过转发引用接受仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38547030/

相关文章:

c++ - C++ 中成员的枚举成员,或替代

c++ - 验证用户输入是否有效数字[从 'char' 到 'char*' 的转换无效]

C++ 声明一个带有大小函数的二维数组

multithreading - x86 CPU 会重新排序指令吗?

c++ - 两个 unordered_maps 的交集

c++ - 为什么这个模板推理失败

java - 如何限制 spring 状态机实例使用的线程数量?

multithreading - 如何在线程中改变 self ?

c++ - std::valarray 的 future 会是什么样子?

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?