短い紹介:私はマルチスレッドのコードを作成しており、2つのスレッド間で動的に割り当てられたオブジェクトを共有する必要があります。私のコードをクリーナーにするためには、各スレッドのオブジェクトを明示的に「削除」したいので、それでshared_ptr
を使いたいのです。shared_ptrを使用したオーバーヘッドと実装
最初の質問:
私はshared_ptr
で-> operator
の実装は、実行時にいくつかの余分なオーバーヘッド(unique_ptr
その後、例えば、より大きな)を持っているかどうかを知りたいです。私が話しているオブジェクトは、通常、オブジェクトのメソッドとフィールドにしかアクセスできないため、作成後に一度しかコピーされないlonglifeインスタンスです(スレッド間でそれらを分散すると)。
ご存知のように、shared_ptr
は参照カウントのみを保護します。
2番目の質問:
のlibstdC++にshared_ptr
を最適化されてどれだけ?それは常にmutexを使用するのか、原子操作を利用するのですか(私はx86とARMプラットフォームに焦点を当てます)?
'shared_ptr'をうまく実装するには、' - > 'でポインタを逆参照するときにオーバーヘッドがゼロになるはずです。私はlibstdC++に慣れていないので、私はあなたの2番目の質問に答えることができません。あなたはヘッダーを持っているので、それがどのように実装されているかを見て簡単に調べることができます。 –
コードがマルチスレッド化されている場合、GCCの共有ポインタは、参照カウンタに 'std :: atomic 'かそのようなものを使用します。それが本当のハードウェア(ロックフリー)かどうかは、コンパイラのバージョンに依存します - これはGCC 4.7.0で改善されたと思います。 –
範囲外のコピー/割り当て/外出には、リフレッシュカウントのスレッドセーフな増分のために余分なオーバーヘッドがあります。 'operator->'は良い古い 'auto_ptr'のものとまったく同じに見えます。すなわち、オーバーヘッドがゼロになると期待できます。 – Damon