[英]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.