与vector一起使用的boost :: shared_ptr很慢?

时间:2013-01-25 12:51:48

标签: c++ memory-management boost

我使用了一个boost共享指针的向量

class Example{

vector<boost::shared_ptr<Point3f> > vec1;
vector<boost::shared_ptr<Point3f> > vec2;
vector<boost::shared_ptr<Point3f> > vec3;

};

point3f是具有3个浮点数的结构,我在vec1,vec2,vec3中推送50000个元素。 它工作得很好。但是使用这种载体增加了这类载体的破坏​​时间。 我能想到的一个可能的解释是每当矢量对象被销毁时,然后对于向量内的每个对象,都会调用析构函数。 它是否使破坏变得缓慢?

我应该使用C风格的malloc和free或C ++风格的new和delete来管理内存吗?

2 个答案:

答案 0 :(得分:1)

shared_ptr具有进行引用计数的额外开销。例如

vec1.push_back(sp);
vec2.push_back(sp);
vec3.push_back(sp);

对于每个副本,引用计数器递增。对于每次销毁,参考计数器递减。只有当它到达0时,对象本身才会被破坏。

如果对象是非平凡的,那么破坏需要一些时间,shared_ptr引入的开销只有在析构函数比递增/递减操作大得多时才会显着。

要查看源是否真的使用shared_ptr,您可以比较现在只使用原始指针并手动删除它们的时间。

确保向量不会重新分配。提前指定大小,或使用reserveresize - 这可能是大型向量与智能指针结合的瓶颈。

答案 1 :(得分:1)

如果您不需要引用计数对象,则应使用boost::ptr_vector

#include <boost/ptr_container/ptr_vector.hpp>

boost::ptr_vector<Point3f> vector;
vector.push_back(new Point3f()); // safe!

或者,使用C ++ 11,您可以使用std::unique_ptr来实现相同的功能,因为与boost::scoped_ptr不同,它具有复制语义。

#include <memory>
#include <vector>

std::vector<std::unique_ptr<Point3f>> vector;
vector.push_back(std::unique_ptr<Point3f>(new Point3f())); // also safe!

这两种方法的性能几乎与原始指针的向量相同,当然使用起来更容易,使用更安全。