0

我使用了一个 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 中 push_back 50000 个元素。它工作得很好。但是这种向量的使用增加了这个类的销毁时间。我能想到的一个可能的解释是,每当向量对象被销毁时,对于向量内的每个对象,都会调用析构函数。那么是不是让破坏变慢了呢?

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

4

2 回答 2

1

Ashared_ptr具有执行引用计数的额外开销。例如

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

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

无论如何,如果对象是非平凡的,则销毁将花费一些时间,shared_ptr只有当析构函数比递增/递减操作大得多时,由 引入的开销才会明显。

要查看源是否实际上是您对 的使用shared_ptr,您可以将现在的时间与仅使用原始指针并手动删除它们进行比较。

确保向量不会重新分配。预先指定大小,或者使用reserveor resize- 这可能是大向量与智能指针相结合的瓶颈。

于 2013-01-25T12:59:48.223 回答
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!

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

于 2013-01-25T22:31:25.187 回答