1

auto_ptrshared_ptrのパフォーマンスの問題に関する情報は見つかりませんでした(私はtr1実装を使用しています)。shared_ptr は auto_ptr に比べて複雑なので、auto_ptr の方が高速ですか? 一般的な質問では、auto_ptr と比較して shared_ptr のパフォーマンスについて何が言えるでしょうか?

PS: auto_ptr よりも unique_ptr の方が望ましいことはわかっていますが、すべてのコンパイラがサポートしているわけではないため、質問は auto_ptr と shared_ptr についてです。

4

4 に答える 4

4
  1. 間接参照する場合、パフォーマンスの違いはありません。

  2. shared_ptrをmake_sharedで割り当てる場合、ヒープ割り当てを無駄にすることはありません。

  3. (オブジェクトではなく)ポインターをコピーする場合、shared_ptrは、参照カウンターを増やす必要があるため、少し遅くなります。

ただし、これらはおそらく問題ではないため、shared_ptrとmake_sharedを組み合わせて使用​​してください。

于 2012-06-12T13:56:27.663 に答える
2

auto_ptr非推奨のC++98コンストラクトです。そのため、パフォーマンス上の利点は、新しく作成されたC ++ 11コードで使用するべきではなく、代わりにコンパイラ/ライブラリメンテナにアナグマを付けてのサポートを実装する必要があるという事実よりもはるかに重要ですunique_ptr

そうは言っても、問題があることをプロファイリングしていない限り、ユースケースに意味的に適合するものを使用してください...*_ptr

于 2012-06-12T13:59:40.987 に答える
1

すべてのパフォーマンスの問題と同様に、特定のセットアップで自分で測定する必要があります。

ただし、一般に、囲まれたポインターの適切な共有動作を保証するために、舞台裏でさらにいくつかの作業を行う必要があるため、shared_ptr<>よりもオーバーヘッドが増えることが予想されます。auto_ptr<>

一方、この2つは実際には比較できません。つまり、auto_ptr<>1つのコピーのみをサポートし(所有権はコピーで譲渡されます)、shared_ptr<>複数のコピーをサポートします。したがって、1つのコピーポインタに対して上記のポインタのみを使用しない限り、意味のある比較を行うことはできません。ワンコピーポインタを使用してて、それ以上のコピーが必要ないと確信している場合は、専用のを使用してauto_ptr<>ください。

いずれにせよ、パフォーマンスの違いが重要であるかどうかは、特定のプロジェクトによって異なります。

于 2012-06-12T13:58:32.370 に答える
1

一般的に、唯一の良い答えはを測定することです。

しかし、この場合、それshared_ptrを使用していない限りmake_shared、カウンターブロックの動的な割り当てが必要であり、非常に優れた小さなオブジェクトアロケータがない限り、最初のオブジェクトを作成するのは非常に遅くなります(桁違いに話します)。オブジェクトへの共有ポインタ。

しかし、おそらくBoostと標準ライブラリを使用すると、割り当てが実際に最適化されます。そして、おそらく!make_shared、オブジェクトとその制御ブロックの両方に1つの割り当てを使用するために使用できます。だから…測定します。

ちなみに、auto_ptrは非推奨です。

代わりに、最新のコンパイラを使用unique_ptrします。

于 2012-06-12T13:56:03.243 に答える