std :: move操作C++

Sau*_*ahu 6 c++ multithreading move c++11

来自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));
Run Code Online (Sandbox Code Playgroud)

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

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

为什么他们不能直接转让所有权process_big_object

Fra*_*ank 11

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

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


Som*_*ude 9

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

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