簡體   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