簡短介紹:我正在研究多線程代碼,我必須在兩個線程之間共享動態分配的對象。爲了讓我的代碼更清潔(並且更少出錯),我想明確地「刪除」每個線程中的對象,這就是爲什麼我想要使用shared_ptr
。使用shared_ptr的開銷和實現
第一個問題:
我想知道,如果在shared_ptr
實施-> operator
具有在運行時產生一些額外開銷(例如較大然後unique_ptr
)。我所談論的對象通常是在創建之後只複製一次longlife實例(當我在線程之間分配它們時),那麼我只能訪問這些對象的方法和字段。
我知道,那shared_ptr
只保護引用計數。
第二個問題:
如何很好的shared_ptr
在優化的libstdC++?它總是使用互斥鎖還是利用原子操作(我專注於x86和ARM平臺)?
在'shared_ptr'的好實現中,當通過' - >'解引用指針時,應該有零開銷。我不熟悉libstdC++,所以我無法回答你的第二個問題。儘管如此,你還是有標題的,所以你可以通過看看它是如何實現的。 –
如果代碼是多線程的,GCC的共享指針使用'std :: atomic'或類似的參考計數器;無論這是一個真正的硬件(lockfree)原子取決於編譯器版本 - 我相信這在GCC 4.7.0中得到了改進。 –
由於引用計數的線程安全增量,複製/分配/超出範圍會帶來額外開銷。 'operator->'看起來與舊的'auto_ptr'完全一樣,即可以預計爲零開銷。 – Damon