簡體   English   中英

共享指針的復制和交換效率

[英]Copy&Swap efficiency for shared pointers

這可以看作是后續操作,例如為什么“交換”共享指針分配?

問題是關於在boost中使用的Copy&Swap習慣用法。

我確實知道復制和交換的好處是重用了現有代碼,從而避免了重復和錯誤。 但是有2種情況(並非只有1種可以減少到其他情況)不是最佳的:

  1. 智能指針實例相同
  2. 包含的指針是相同的

對於shared_ptr ,引用計數器是原子遞增的,而對於intrusive_ptr (僅遞增 ),它們可能是遞增的 因此,復制成本很高

如果以如下方式實現分配,則可以避免這種情況:

smart_ptr& operator=(const smart_ptr& other){
  if(this->ptr_ == other.ptr_) return *this;
  smart_ptr(other).swap(*this); // I assume I can simply do this here, right?
  return *this;
}
smart_ptr& operator=(smart_ptr&& other){
  smart_ptr(std::move(other)).swap(*this);
  return *this;
}

這不是最快,最安全的實現,還是我沒有看到任何問題?

如果速度最快,為什么不使用boost或stdlib?

為了澄清第2點,請考慮以下代碼:

smart_ptr a(new foo);
auto b = a;
...
// Eventually:
a = b;

不是 &a != &b自我分配。 復制和交換確實涉及對參考計數器的不必要的修改。

自賦值並不常見,因此每次進行測試然后再以任何一種方式進行交換都會花費更多。 同樣,復制指針基本上是一個人可以執行的最快復制。

復制shared_ptr的實際成本是原子引用增量(可能涉及在下面使用互斥鎖)。

如果您真的想測試兩種方法的性能,我建議您獲取google基准測試庫,並編寫一組測試用例(用於自定義和所有其他用例)並進行測量。 請記住,這些天的優化器可以使您的代碼對其進行優化感到驚奇。 如果不進行度量,很難確定它是否更快,但是我想如果沒有它,該版本似乎會很昂貴:)

編輯:

如果您不希望引用計數增加(這對於復制shared_ptr是昂貴的部分),則可以始終使用move構造函數:

smart_ptr a(new foo);
auto b = a;
...
// Eventually:
a = std::move(b);

暫無
暫無

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

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