我使用了一个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来管理内存吗?
答案 0 :(得分:1)
shared_ptr
具有进行引用计数的额外开销。例如
vec1.push_back(sp);
vec2.push_back(sp);
vec3.push_back(sp);
对于每个副本,引用计数器递增。对于每次销毁,参考计数器递减。只有当它到达0
时,对象本身才会被破坏。
如果对象是非平凡的,那么破坏需要一些时间,shared_ptr
引入的开销只有在析构函数比递增/递减操作大得多时才会显着。
要查看源是否真的使用shared_ptr
,您可以比较现在只使用原始指针并手动删除它们的时间。
确保向量不会重新分配。提前指定大小,或使用reserve
或resize
- 这可能是大型向量与智能指针结合的瓶颈。
答案 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!
这两种方法的性能几乎与原始指针的向量相同,当然使用起来更容易,使用更安全。