Shared_ptrに特化したコレクション
-
12-09-2019 - |
質問
Shared_ptrの内部を認識しているコレクションが存在し、内部の弱いポインターをコピーするだけで保存されたshared_ptr要素の定期的なコピーを回避しますか?
これは、暗黙的に、コンストラクター/デストラクタの呼び出しが行われず、shared_ptrsの参照カウンターの操作がないことを意味します。
解決
それはshared_ptr内部を認識しています、
それはあなたの質問にすぐに答えるはずです。内部に注意するには、そのようなコレクションは、ほぼ確実にBoostのスマートポインターライブラリの一部である必要があります。残念ながら、そのようなことはありません。
これは確かにスマートポインターの欠点です。内部で行われるコピーの数を制限するデータ構造を使用することをお勧めします。ベクターの再割り当ては苦痛になります。おそらく、チャンクベースの割り当てを持っているデクは有用です。ベクトルの実装は、指数関数的に増加するチャンクで新しいメモリを得る傾向があることにも留意してください。そのため、たとえば、10個の要素ごとに再割り当てしません。代わりに、128の要素から始めてから、ベクターは自体を256に留保し、必要なものを2倍にするたびに512、1024などに移動します。
これに至って、BoostのPTR_VECTORがあり、データ構造を内部コピーを防ぐのに十分なスペースで事前に登録しています。
他のヒント
理論的には、C ++ 0xが採用された後、必要に応じてMoveセマンティクスを使用するようにコンテナが変更されます。その時点で、 shared_ptr
また、不必要な参照カウント調整を最小限に抑えるために、移動コンストラクターを持つように変更することもできます。