出力は次のようになります。のSTD C++コンテナ要素の破壊と挿入行動
Instance Albert of class Foo created!
Instance Bert of class Foo created!
Press any key...
Instance Albert of class Foo copied!
Instance Albert of class Foo copied! // why another copy?
Instance Albert of class Foo destroyed! // and destruction?
Press any key...
Instance Bert of class Foo copied!
Instance Bert of class Foo copied!
Instance Bert of class Foo destroyed!
Press any key... // v1=v2 why did the albert instance not get destroyed?
Press any key...
Instance Bert of class A destroyed!
Instance Bert of class A destroyed!
Press any key... // there's still an albert living in the void
これは非常に奇妙なとして私を打ちます。 とにかく2度コピーされると、何かを参照として渡すのはなぜですか? なぜv1.operator =(他の)それが含んでいる要素を破壊しないのですか? shared_ptrの動作にうまく収まるでしょう。 誰かが私にその理由を教えてもらえますか?
ADDITION 私は少なくとも MEM漏れを生産していないようだ、無限ループにこれを入れて、メモリ使用量をチェックします。
追加 [OK]をクリックします。[OK]をクリックし、[OK]をクリックします。 追加すると
v1.reserve(10);
v2.reserve(10);
論理的なコピー回数が発生します。それなしでは、すべての単一のpush_backに対してベクトル全体を再割り当てしてコピーします(小さなベクトルでもかなり遅れていることがわかります)。 このを見て、私はもっと.reserve使用することを検討して地獄のような私の代入演算子を最適化するには:)
ADDITION:概要
- すべてのこれらの問題は、VC++ 2005に固有のようです。
- 2つのコンテナのサイズが一致する場合、実装では、古いものを破棄して新しいものをコピーする代わりに 要素のoperator =を使用して、 サウンドプラクティスのようです。サイズが異なる場合、通常の破壊とコピーが使用されます。
- 2005年の実装では、予備を使用する必要があります!そうでなければ、深刻ではなく、標準に準拠しない性能。
- これらの黒いボックスは、私が思ったよりもはるかに黒いです。
リリースビルドとしてコンパイルしてみましたか? – jalf
はい。同じ結果。 – AndreasT
自分自身を試してみて、空のプロジェクトにペーストをコピーして、iostream、ベクトル、文字列をインクルードして追加してください。 – AndreasT