0

ブースト共有ポインターのベクトルを使用しました

class Example{

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

};

point3f は 3 つの float を持つ構造体で、vec1、vec2、vec3 で 50000 要素を push_back します。それは完全に正常に動作します。しかし、この種のベクターを使用すると、このクラスの破壊時間が長くなります。私が考えることができる可能な説明は、ベクトルオブジェクトが破棄されるたびに、ベクトル内の各オブジェクトに対してデストラクタが呼び出されるということです。それで、それは破壊を遅くしていますか?

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.

ただし、ベクトルが再割り当てされないようにしてください。事前にサイズを指定するか、 または を使用reserveresizeます。これは、スマート ポインターと組み合わせた大きなベクトルのボトルネックになる可能性があります。

于 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 に答える