簡體   English   中英

使用std :: move與std :: shared_ptr

[英]Using std::move with std::shared_ptr

我有一個定義如下的函數:

void foo(std::shared_ptr<X> x) { ... };

如果我向X聲明一個共享ptr:

std::shared_ptr<X> sourcePtr(new X(...));

然后我可以按如下方式調用foo

foo(std::move(sourcePtr));

要么

foo(sourcePtr);

據我所知,如果我使用第一個選項,那么sourcePtr將變為null。 它是否也會阻止引用計數遞增?

如果這無關緊要,我更喜歡哪個選項? 做出這樣的決定時,我應該考慮其他事情嗎?

是的,如果將共享指針移動到函數中,則:

  1. 原始的sourcePtr將變為null,並且

  2. 引用計數不會被修改。

如果你知道在函數調用之后你將不再需要sourcePtr的值, sourcePtr將它移動到函數中是一種輕微的優化,因為它保存了一個原子增量(當sourcePtr超出范圍時,后來減少)。

但是,請注意標識符sourcePtr對於作用域的其余部分仍然有效,只需保留空指針即可。 這意味着如果你在移動后使用它,編譯器不會抱怨,但是如果你忘了它被移動了,你很可能取消引用null。 我傾向於使用這種“優化” move ,並且我也被它咬了幾次:函數中添加了更多功能,如果你忘記撤消move ,你會得到一個很好的崩潰。

因此,當您不再需要它時移動是輕微的優化,同時還有輕微的維護負擔。 在您的情況下,由您來衡量哪個更重要。

上面假設有一些代碼實際上在其聲明和foo的最終調用之間使用了sourcePtr (感謝@WhozCraig指出它)。 如果沒有,你會關閉創建在調用點的指針向右好得多

foo(std::make_shared<X>(...));

這樣,您可以保存相同數量的原子操作, 並且沒有潛在危險的空共享指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM