簡體   English   中英

Boost Weak_Ptr:銷毀比預期更昂貴

[英]Boost Weak_Ptr: Destruction is more expensive than expected

無論出於何種原因,我們都會從破壞弱指針中看到相當多的成本。 這是罪魁禍首代碼:

~weak_count() // nothrow  
{  
    if(pi_ != 0) pi_->weak_release();  // Consumes a huge chunk of our time.
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
    id_ = 0;  
#endif  
} 

我們沒有處於調試模式,並且調試掛鈎未被使用。 弱釋放正在消耗真正驚人的時間。 這是一個已知的問題? 我們做錯了嗎?

提升版:1.36
編譯器:VS2008編譯器套件。

不幸的是,由於各種原因,我們被鎖定在這個Boost版本中,所以我更想知道這些奇怪的支出是否可以在新版本上重復,或者代表已知不良做法的結果。 我們只破壞了500k弱指針的順序,它們不會因破壞相似數量的原始指針而在性能上產生明顯的差異。 當然不會增加2.5-4倍的成本。 請注意,我們不會刪除所述指針所針對的對象。 這筆費用完全來自指針本身的破壞。

這里發生了什么?

weak_ptr需要像shared_ptr這樣的東西來實現自己 - 因為它需要能夠確定指針是否仍然存在,它需要在某處維護它自己的refcounts的引用計數結構。

即, weak_ptr如何確定對象是否仍然存在,除非引用計數以某種方式保持可用以使其到達? :)

如果您不需要使用weak_ptr實際獲取一段代碼中的所有權,那么您可以通過傳遞原始指針而不是weak_ptr來逃脫。

最有可能的是,成本來自引用計數的原子減量,與整數分配相比,它相當昂貴,並且可能導致緩存(或非常極端,頁面)未命中/故障,並且是原子操作,它也可能導致緩存行失效等問題。

然而,破壞原始指針是一種無操作,所以我不完全確定你對weak_ptr的期望是什么,但如果它提供任何類型的破壞語義,它在物理上不可能提供相同的破壞成本。

同樣地,你可能會過度使用它們。 所有權執行指針不是銀彈 - 您仍然需要考慮誰擁有該對象。 弱指針的大規模使用告訴我你沒有真正考慮過你的所有權語義。

最后,在std :: tr1命名空間中,MSVC 2008中有一個shared_ptr和weak_ptr的實現。 你可以試試。

暫無
暫無

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

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