使用std :: vector <boost :: shared_ptr <base_class>&gt;的性能考虑因素是什么?或者boost :: ptr_vector <base />?</boost :: shared_ptr <base_class>

时间:2012-01-26 02:50:56

标签: c++ boost stl shared-ptr

使用引用计数智能指针向量的好处很多。我不再需要担心清理内存,我甚至可以在容器中存储指向派生类的指针,它们也会处理得很好。

这一切都非常精彩,但它让我想知道其含义。如果我的容器能够正确地清理指向我可能插入的派生类的指针,那意味着必须发生某种类型的RTTI。即使我从未将派生类指针放入容器中,也会产生这种成本吗?

2 个答案:

答案 0 :(得分:2)

我对大多数关于表现的问题的通常建议是:

  • 性能方面的考虑可能不会超过其他问题,例如制作简单明了的代码
  • 如果您仍然认为它们可能很重要(或者您只是好奇),那么您无法可靠地思考您的答案:您真的需要衡量它。

正如另一个答案所说,这里没有RTTI;当引用计数降至零时,shared_ptr只会调用delete以正常方式销毁对象。 (或它做了有效等效的事情)

所涉及的任何性能影响应该仅限于T*shared_ptr<T>之间的差异。 (虽然我不熟悉ptr_vector ....)

答案 1 :(得分:1)

没有RTTI,只是直接的多态性。如果你的类层次结构已经是多态的(即具有虚拟析构函数等),那么绝对不会有来自多态的额外成本。

应该担心的是共享指针的成本。如果可能,请查看unique_ptr<Base>是否足够。共享指针的原子引用计数更新可能是一个不可忽视的成本。