2012-07-12 60 views
1

可能重複:
Should I pass a shared_ptr by reference?
Passing smart pointers as arguments如何將std :: shared_ptr <Resource>傳遞給函數?

我應該通過值或常量引用傳遞呢?我已經閱讀了許多關於是否通過值或通過常量引用傳遞可複製構造對象的經驗法則。如:

  1. 通通過恆定參考物體和由值(除功能對象)內建類型
  2. 傳值除非對象(包括動態存儲器)的大小小於2 *雙尺寸。

您能否解釋這些規則如何適用於std::shared_ptr<Resource>?我明白這個對象可能非常小,可能是一個指針和一個引用計數器,但它仍然是一個對象。這裏最好的做法是什麼?

+0

啊,是的,對不起,我的壞 – 2012-07-12 06:13:23

+2

我的經驗法則是:當你想要引用語義時通過引用傳遞,當你想要值語義時傳遞值。我認爲他們優於你一直在閱讀的那些。 (他們也更容易記住:P) – 2012-07-12 06:17:21

+0

@RMartinhoFernandes:如何做const引用到那個?我經常閱讀的經驗法則建議,在我基本上對價值語義感興趣(我認爲查詢對象而不改變它)而不是引用語義(我希望修改對象的能力)的情況下,通過const引用傳遞。)或者你剛纔說了一個重言式:「當你想要引用時通過引用傳遞,當你想要值時傳遞值」? – Managu 2012-07-12 06:25:38

回答

0

也許最重要的問題(就性能而言)是創建一個std::shared_ptr<...>的副本(例如在按值傳遞時發生)需要引用計數的互鎖增量。或者可能是一些其他形式的同步,如關鍵部分,具體取決於實施。多線程程序中的這種成本可能很大。

通過引用傳遞幾乎肯定是一個更好的選擇。它的主要缺點是(boost::shared_ptr<...>?),shared_ptr<...>只提供標準的線程安全保證:除非所有的訪問僅限於const方法,否則必須保護訪問單個shared_ptr<...>(例如通過互斥鎖)。在多線程情況下,將const引用傳遞給shared_ptr<...>可能會使確保正確同步變得更加困難。

在單線程程序中,它可能沒有太大區別。

+0

我完全不同意這是最重要的問題。最重要的問題應該是獲得一個正確的計劃,即是否要分享所有權。 – 2012-07-12 06:18:21

+0

@RMartinhoFernandes:好點。我認爲我的意思是「關於表現的最重要的關注點。」雖然我知道我應該剛剛回答「請問你的友好輪廓儀的性能。「 – Managu 2012-07-12 06:20:01

+0

無論如何,你似乎在爭論通過引用(拋開爲什麼有人甚至想要引用智能指針的問題)的性能更高,因爲不是可能的無鎖操作,而是可以獲得同步你可以用互斥體解決這個問題,向我反饋回來 – 2012-07-12 06:25:07

相關問題