当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么std::thread通过转发引用接受仿函数》经验,为你挑选了1个好方法。

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

一般来说为什么不模拟函数以便按值获取函数对象?可以引用 - 不能用reference_wrappers 模仿(这将更明确,并且还方便地有一个成员operator()来调用存储的函数)?



1> Yakk - Adam ..:

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

它必须在存储中有一个功能对象的副本,只要它即将启动的线程持续,它就可以保证持续.

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

所以它必须复制.如果它使用其参数by-value,它将在调用构造函数时创建一个副本,然后必须另外复制到持久存储.通过转发引用来获取它,它只生成一个副本.

现在可以移动这个额外的副本,使额外的开销增加一个额外的动作.这仍然是额外的开销,因为并非所有构造都移动便宜.

一般来说为什么不模拟函数以便按值获取函数对象?

因为这要求额外的move.

可以使用reference_wrappers(它更明确,并且还方便地使用成员operator()来调用存储的函数)来引用-inss;

在您打算存储函数对象的情况下,通过转发引用来保存移动,并且在获取代码的函数对象的编写器方面不需要额外的工作.

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


老实说,我认为答案不会那么简单......有时候过于复杂化很容易
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有