2009-06-05 8 views
5

shared_ptr内部を認識しているコレクションが存在し、内部の弱いポインタをコピーするだけで、保存されたshared_ptr要素を定期的にコピーしないでください。shared_ptrに特化したコレクション

これは、暗黙のうちに、コンストラクタ/デストラクタコールが実行されず、shared_ptrsの参照カウンタが操作されないことを意味します。右があなたの質問に答える必要があるのshared_ptrの内部を認識している

答えて

3

。内部について知るためには、そのようなコレクションは、ほとんどの場合、ブーストのスマートポインタライブラリの一部でなければなりません。残念ながら、そのようなことはありません。

これは確かにスマートポインタの欠点です。内部的に行われるコピー数を制限するデータ構造の使用をお勧めします。 Vectorの再配分は苦しいでしょう。恐らく、チャンクベースの割り当てを持つdequeが便利です。ベクトル実装では、指数関数的に増加するチャンクで新しいメモリが得られる傾向にあることにも留意してください。だから、彼らは、例えば、10の要素ごとに再配分しません。代わりに、128要素から始めることもできます。ベクターはそれ自体256を確保し、最大512、1024などに移動します。必要なときは倍にします。

これは、ブーストのptr_vectorが不足しているか、内部のコピーを防ぐのに十分なスペースをあけてデータ構造を事前に割り当てることです。

9

理論的には、C++ 0xが採用された後、必要に応じて移動セマンティクスを使用するようにコンテナが変更されます。その時点で、shared_ptrは、不要な参照カウント調整を最小限に抑えるための移動コンストラクタを持つように変更することもできます。

+2

C++ 0xドラフトでは、shared_ptrには既にこの動作があります。 –

+0

さて、そこに行く! :) – MSN

関連する問題