2012-01-26 28 views
1

使用引用計數智能指針向量的好處很多。我不再需要擔心清理內存,我甚至可以將指向派生類的指針存儲在容器中,並且它們也可以很好地處理。使用std :: vector <boost :: shared_ptr​​>或boost :: ptr_vector <Base>的性能考慮因素是什麼?

這真是太好了,但它讓我懷疑它的含義。如果我的容器能夠正確清理指向我可能已經插入的派生類的指針,那意味着必須發生某種RTTI。即使我永遠不會將派生類指針放入容器中,這個代價是否會發生?

回答

1

沒有RTTI,只是直截了當的多態性。如果您的類層次結構已經是多態的(即具有虛擬析構函數等),那麼絕對沒有來自多態的額外成本。

應該擔心的是共享指針的代價。如果可能的話,看看unique_ptr<Base>是否足夠。共享指針的原子引用計數更新可能是不可忽略的成本。

+0

我想到,也許'boost :: ptr_vector '會表現得更像'std :: vector >'。真的嗎? –

+0

@StevenLu:我對'boost :: ptr_vector'不是很熟悉,但看起來就是這樣...... –

+2

@Steven:是的,那是完全正確的。如果你真的擁有C++ 11,'std :: vector >'是標準的,因此更可取。 – Nemo

2

我約的表現大多數問題通常的建議是:

  • 性能方面的考慮可能不會超過其他問題像製作簡單,直接的代碼
  • 如果你仍然認爲他們可能是重要的(或你」重新只是好奇),一個不能可靠地認爲你的方式答案:你真的需要措施它。

正如另一個答案所說,這裏沒有RTTI;當參考計數下降到零時,shared_ptr只會調用delete以正常方式銷燬您的對象。 (或它做了一些有效的等效處理)

涉及的任何性能影響應該僅限於T*shared_ptr<T>之間的差異。 (雖然我不熟悉ptr_vector ....)

+0

ptr_vector更好,因爲它不假定資源是共享AFAIK。複製共享指針是一個巨大的性能損失。那麼,取決於你做什麼,當然,如果相對的話 – 2012-01-26 03:22:09

相關問題