繁体   English   中英

std :: move操作C ++

[英]std::move operation C++

来自Anthony Williams的书籍:

以下示例显示了使用std :: move将动态对象的所有权转移到线程中:

 void process_big_object(std::unique_ptr<big_object>); std::unique_ptr<big_object> p(new big_object); p->prepare_data(42); std::thread t(process_big_object,std::move(p)); 

通过在std::thread构造函数中指定std::move(p)big_object的所有权big_object被转移到新创建的线程的内部存储中,然后转移到process_big_object

我理解堆栈和堆; 任何想法,这个内部存储实际上是什么?

为什么他们不能将所有权直接转移到process_big_object

这意味着该对象将临时属于std::thread对象,直到该线程实际启动。

这里的内部存储是指与std::thread对象关联的内存。 它可以是成员变量,也可以在构造函数中保存在堆栈中。 由于这是依赖于实现的,因此使用一般的和非常规的“内部存储”术语。

线程的所有参数都被复制到std::thread对象持有的某个内部存储器中,因此可以将其传递给线程函数。

在将所有权传递给实际线程函数之前,该内部存储器由std::thread对象拥有。

为什么他们不能将所有权直接转移到process_big_object

因为代码片段中没有将process_big_object作为函数调用的行。 代码段的最后一行调用std::thread构造函数。 它将启动一系列事件,最终将导致在新线程中调用process_big_object(p) ; 但这个电话在这里看不到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM