簡體   English   中英

通過引用傳遞智能指針

[英]Passing smart-pointers by reference

智能指針通常很小,因此通過值傳遞不是問題,但是將引用傳遞給它們是否有任何問題; 或者更確切地說是否存在不得做的具體情況?

我正在編寫一個包裝器庫,我的幾個類將智能指針對象包裝在底層庫中...我的類不是智能指針,但API當前通過值傳遞智能指針對象。

例如當前代碼:

void class::method(const AnimalPtr pAnimal) { ... }

void class::method(const MyAnimal &animal){...}

其中MyAnimal是我封裝AnimalPtr新包裝類。

無法保證Wrapper類有一天不會超越包裝智能指針,所以通過值傳遞讓我感到緊張。

在大多數情況下,您應該通過引用傳遞共享指針,而不是值。 雖然std::shared_ptr的大小很小,但復制的成本涉及原子操作(概念上是原子增量和銷毀副本時的原子減量,盡管我相信某些實現設法進行非原子增量) 。

在其他情況下,例如std::unique_ptr你可能更喜歡按值傳遞,因為副本將有一招,它清楚地記錄了對象的所有權被轉移到功能(如果你不想轉移所有權,然后傳遞對真實對象的引用,而不是std::unique_ptr )。

在其他情況下,您的里程可能會有所 您需要了解復制的語義對於智能指針是什么,以及是否需要支付成本。

可以通過引用傳遞智能指針,除非它是構造函數。 在構造函數中,可以存儲對原始對象的引用,這違反了智能指針的約定。 如果你這樣做,你可能會得到內存損壞。 即使您的構造函數今天沒有存儲引用,我仍然會保持警惕,因為代碼更改,如果您稍后決定需要更長時間地保存變量,則很容易錯過。

在普通函數中,您不能將函數參數存儲為任何位置的引用,因為必須在初始化期間設置引用。 您可以將引用分配給一些較長壽的非引用變量,但這將是一個副本,因此會適當地增加其生命周期。 所以在任何一種情況下,當調用函數可能釋放它時,你無法保持它。 在這種情況下,您可能會通過引用獲得較小的性能提升,但在大多數情況下我不會計划注意它。

所以我會說 - 構造函數,總是按值傳遞; 其他功能,如果你願意,可以通過引用傳遞。

暫無
暫無

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

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