2012-01-26 6 views
1

参照カウントされたスマートポインタのベクトルを持つ利点は多くあります。私はもはやメモリのクリーンアップについて心配する必要はなく、コンテナ内の派生クラスへのポインタを格納することさえでき、それらもうまく処理されます。何のstd ::ベクトルを使用した場合のパフォーマンスの考慮事項は、<:: shared_ptrの後押し​​>であるか、後押し:: ptr_vector <Base>?

これは、すべて本当に素晴らしいですが、それは私が含意について思ってしまいます。私のコンテナが、それに挿入されているかもしれない派生クラスへのポインタを正しくクリーンアップすることができれば、何らかのRTTIが発生しなければならないことを意味します。派生クラスポインタをコンテナに置いたことがない場合でも、そのコストは発生するでしょうか?

答えて

1

何RTTI、ただ素直多型はありません。クラス階層が既に多相である場合(つまり、仮想デストラクタなどがある場合)、多型から生じる追加コストはまったくありません。

あなたはとする必要があります共有ポインタのコストが心配です。可能であれば、unique_ptr<Base>が実際に十分かどうかを確認してください。共有ポインタの原子参照カウントの更新は、おそらく無視できないコストです。パフォーマンスに関するほとんどの質問について

+0

おそらく 'boost :: ptr_vector 'は 'std :: vector >のように動作します。本当? –

+0

@StevenLu:私は 'boost :: ptr_vector'に大変慣れていませんが、それはそのように見えます... –

+2

@スペーベン:はい、そうです。また、実際にC++ 11を使用している場合、 'std :: vector >'が標準であり、したがって好ましいものです。 – Nemo

2

私のいつものアドバイスは次のとおりです。

  • パフォーマンスの考慮事項は、おそらくあなたがまだ彼らは重要かもしれないと思う場合は、単純な、簡単なコード
  • を作るような他の懸念を上回る(またはしないでください」 )ただ好奇心再、一つは確実にあなたの方法の答えを考えることはできません:あなたは本当に対策それをする必要があります。

他の答えが言ったように、ここで起こって何のRTTIはありません。参照カウントが0になったときに、shared_ptrは単に通常の方法で、あなたのオブジェクトを破壊するdelete起動します。関与

いかなるパフォーマンスへの影響はかなりT*shared_ptr<T>との違いに単純に制限する必要があります(またはそれが効果的に同等の何かを)。 (私はptr_vector ....に慣れていませんが)

+0

ptr_vectorは、リソースがAFAIKで共有されているとは限りません。共有ポインタをコピーすると、パフォーマンスが大幅に低下します。まあ、あなたがしていることに応じて、もちろん、すべての相対 –

関連する問題