![](/img/trans.png)
[英]Copy&Swap idiom warning : recursive on all control paths, function will cause runtime stack overflow
[英]Copy&Swap efficiency for shared pointers
這可以看作是后續操作,例如為什么“交換”共享指針分配? 。
問題是關於在boost中使用的Copy&Swap習慣用法。
我確實知道復制和交換的好處是重用了現有代碼,從而避免了重復和錯誤。 但是有2種情況(並非只有1種可以減少到其他情況)不是最佳的:
對於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.