使用引用計數智能指針向量的好處很多。我不再需要擔心清理內存,我甚至可以將指向派生類的指針存儲在容器中,並且它們也可以很好地處理。使用std :: vector <boost :: shared_ptr>或boost :: ptr_vector <Base>的性能考慮因素是什麼?
這真是太好了,但它讓我懷疑它的含義。如果我的容器能夠正確清理指向我可能已經插入的派生類的指針,那意味着必須發生某種RTTI。即使我永遠不會將派生類指針放入容器中,這個代價是否會發生?
使用引用計數智能指針向量的好處很多。我不再需要擔心清理內存,我甚至可以將指向派生類的指針存儲在容器中,並且它們也可以很好地處理。使用std :: vector <boost :: shared_ptr>或boost :: ptr_vector <Base>的性能考慮因素是什麼?
這真是太好了,但它讓我懷疑它的含義。如果我的容器能夠正確清理指向我可能已經插入的派生類的指針,那意味着必須發生某種RTTI。即使我永遠不會將派生類指針放入容器中,這個代價是否會發生?
沒有RTTI,只是直截了當的多態性。如果您的類層次結構已經是多態的(即具有虛擬析構函數等),那麼絕對沒有來自多態的額外成本。
你應該擔心的是共享指針的代價。如果可能的話,看看unique_ptr<Base>
是否足夠。共享指針的原子引用計數更新可能是不可忽略的成本。
我約的表現大多數問題通常的建議是:
正如另一個答案所說,這裏沒有RTTI;當參考計數下降到零時,shared_ptr
只會調用delete
以正常方式銷燬您的對象。 (或它做了一些有效的等效處理)
涉及的任何性能影響應該僅限於T*
和shared_ptr<T>
之間的差異。 (雖然我不熟悉ptr_vector
....)
ptr_vector更好,因爲它不假定資源是共享AFAIK。複製共享指針是一個巨大的性能損失。那麼,取決於你做什麼,當然,如果相對的話 – 2012-01-26 03:22:09
我想到,也許'boost :: ptr_vector '會表現得更像'std :: vector >'。真的嗎? –
@StevenLu:我對'boost :: ptr_vector'不是很熟悉,但看起來就是這樣...... –
@Steven:是的,那是完全正確的。如果你真的擁有C++ 11,'std :: vector>'是標準的,因此更可取。 –
Nemo