为什么std::thread通过转发引用接受一个函子
Why std::thread accepts a functor by forwarding reference
为什么std::thread
对象通过转发引用接受函数参数,然后用decay_copy
复制对象?只接受函数对象的值不是更容易吗?
一般来说,为什么不将函数模板化,以便按值获取函数对象?引用性可以不用reference_wrapper
s模仿吗?(它会更明确,也方便地有一个成员operator()
来调用存储的函数)?
为什么
std::thread
对象通过转发引用接受函数参数,然后用decay_copy复制对象?只接受函数对象的值不是更容易吗?
它必须在存储中有一个函数对象的副本,它可以保证它将要启动的线程持续多久。
构造std::thread
的函数参数不会持续那么长时间,因为创建std::thread
的行可能在创建的线程结束之前很久就结束了。
所以它必须复制。如果它按值获取参数,它将在调用构造函数时生成一个副本,然后必须将另一个副本复制到持久存储。通过转发引用获取它,它使正好成为一个副本。
现在,这个额外的副本可以移动到,使额外的开销增加一步。这仍然是额外的开销,因为并不是所有的结构都是廉价的。
一般来说,为什么不将函数模板化,以便按值获取函数对象?
因为这需要额外的move
。
引用可以不使用reference_wrappers来模仿吗(它会更显式,而且还方便地有一个成员运算符()来调用存储的函数)?
在打算存储函数对象的情况下,通过转发引用获取可以保存移动,并且不需要函数对象获取代码的编写者做太多额外的工作。
如果调用方传入引用包装,则存储的值将是引用包装,这具有不同的含义。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 分离一个静态常量 std::thread?
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 给自己一个std::shared_ptr<std::thread>。已定义或未定义的行为
- 在linux下使用boost::thread创建一个boost::asio工作线程
- 如何安全地关闭一个有无限循环的THREAD
- 实现一个完美转发到std::thread的函数
- 构造一个 std::thread via (Args&&...)
- 访问可调用对象 一个 boost::thread 是用来构造的
- 从另一个 std::thread 调用 Qt 对象方法
- 不能将类成员函数传递给另一个函数(std::thread::thread)
- 将一个成员函数传递给std::thread,但没有地址
- 获取一个 std::thread 来分离并终止自身
- 将数据从调用方线程传递到另一个 boost::thread 中的方法
- std::thread::id 默认构造函数不应该创建一个"NULL" id吗?
- Boost::thread如何获得一个指向调用我的函数的线程的指针
- 为什么std::thread通过转发引用接受一个函子
- 使用 boost::thread 将 c++ 对象从一个线程传递到另一个线程的正确方法是什么?
- 使用Boost Thread在具有不同输入的多个线程上运行一个函数
- 这是Microsoft实现std::thread的一个大错误吗?