shared_ptr とscoped_ptr
-
21-09-2019 - |
質問
scoped_ptr
コピーできないため、範囲外に削除されています。だからある意味制限されてるんだよ shared_ptr
. 。したがって、本当にコピー操作を制限する必要がある場合は別のようです shared_ptr
を使用する方が良いです。オブジェクトのコピーを作成する必要があるのか、それとも作成する必要がないのかがわからない場合があるからです。そこで質問は次のとおりです。上記のケース以外に、次のようなことも考えられますか? shared_ptr
の代わりに使用する方が良い (または推奨されます) scoped_ptr
. 。する scoped_ptr
~よりはるかに速く作業できる shared_ptr
, 、それとも何かメリットがあるのでしょうか?
ありがとう!
解決
shared_ptr
はscoped_ptr
よりもヘビー級です。これは、参照カウントのオブジェクトと同様に管理対象オブジェクトを割り当て、解放する必要があり、ハンドルスレッドセーフな参照カウントに - 私が働いていた一つのプラットフォーム上で、これはかなりのオーバーヘッドでした。
(一般的に)私のアドバイスは、あなたのニーズを満たす最も簡単なオブジェクトを使用することです。あなたは参照カウントの共有が必要な場合は、使用しshared_ptr
。あなたは、単一の参照、使用scoped_ptr
を終了したら、あなただけの自動削除が必要な場合。
他のヒント
パフォーマンス - shared_ptr
より多くの機能がありますが、追加の割り当ても必要です (サイズも大きくなりますが、それが問題になることはほとんどありません)。
[編集] 2 番目の割り当ては次の方法で回避できます。 make_shared
, 、 しかしその後 weak_ptr
オブジェクトが破棄された後でも割り当て全体が保持されますが、これは大きなオブジェクトの場合に問題になる可能性があります。
意思表示 を使用して scoped_ptr
やりたいことをより明確に述べます。(気になる方のために言っておきますが、それは良いことです:))。これを正しく行うと、shared_ptr は「このオブジェクトはこのスコープを超えて存続することを目的としている」ことも示します。
本来の目的が異なるので、多くの場合、「scoped_ptrを対のshared_ptrは」全く問題ではありません。あなたが必要とするすべてはscoped_ptrをされたときに確かに、あなたはshared_ptrのを使用することができます。しかし、ポイントは何ですか? shared_ptrのは、おそらく、すべての参照カウントと大きめオーバーヘッドが関与しています。
scoped_ptr
はshared_ptr
からはるかに高速に動作します。それはそうです。 shared_ptr
常にあなたのアロケータまたはデフォルトアロケータを使用してメモリを割り当てます。
はscoped_ptrを少しのshared_ptr、weak_ptrを、またはunique_ptrをと共通しています。それはあなたがうまく設計されたコードの中で非常に頻繁に必要となるものではありませんが、利用できる持っている優れたツールです。
基本的には、scoped_ptrをすべての参照カウントものではありません。むしろ、それはあなたがこのような何かを行うことができますので、あなたは(ローカルスコープ内)スタック上に作成したオブジェクトは、次のとおりです。
//Some enclosing scope- anything set off by "{}" or even a function:
{
scoped_ptr<MyObject> ptr = new MyObject( parameters...);
} // When we hit this closing brace, "ptr" will delete the "MyObject" inside.
それはAに全体の「{}」スコープを回すために削除したときに、あなたはミューテックスと私はそれに渡されたミューテックスをロックします「AutoLockの」を宣言することができprimatives-他の同期でより多くのこのパターンを見る傾向がある、それをアンロッククリティカルセクションます。
あなただけのようなプレーンな古いスタック割り当てを行うことができない場合「scoped_ptrを」だけで今までに理にかなっていることも注目「MyObjectにOBJ(のparamsを...)」何らかの理由で。結局のところ、何がやっていることは、それがスタック上の一つであったかのように、ヒープ割り当てられたオブジェクトを使わせています。すなわち、shared_ptrの&そのいとこの参照カウントよりユースケース稀多くなる傾向がある。