[英]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。 它是否也會阻止引用計數遞增?
如果這無關緊要,我更喜歡哪個選項? 做出這樣的決定時,我應該考慮其他事情嗎?
是的,如果將共享指針移動到函數中,則:
原始的sourcePtr
將變為null,並且
引用計數不會被修改。
如果你知道在函數調用之后你將不再需要sourcePtr
的值, sourcePtr
將它移動到函數中是一種輕微的優化,因為它保存了一個原子增量(當sourcePtr
超出范圍時,后來減少)。
但是,請注意標識符sourcePtr
對於作用域的其余部分仍然有效,只需保留空指針即可。 這意味着如果你在移動后使用它,編譯器不會抱怨,但是如果你忘了它被移動了,你很可能取消引用null。 我傾向於使用這種“優化” move
,並且我也被它咬了幾次:函數中添加了更多功能,如果你忘記撤消move
,你會得到一個很好的崩潰。
因此,當您不再需要它時移動是輕微的優化,同時還有輕微的維護負擔。 在您的情況下,由您來衡量哪個更重要。
上面假設有一些代碼實際上在其聲明和foo
的最終調用之間使用了sourcePtr
(感謝@WhozCraig指出它)。 如果沒有,你會關閉創建在調用點的指針向右好得多 :
foo(std::make_shared<X>(...));
這樣,您可以保存相同數量的原子操作, 並且沒有潛在危險的空共享指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.