連想コンテナ(5)
コンテナにオブジェクトの実体を入れる場合,Insertに参照渡しをしても,insertでもpush_backでもコピーコンストラクタが3回呼ばれる.
v.insert( it, Item(key, data)); // 1.Item(key, data)で作成, insertが _Insert_n(_Where, (size_type)1, _Val); を呼び出す. // 2._Valがシーケンス内を指している場合に備えてコピーする. // シーケンス内を指していなければ無駄なのに… // 3.シーケンス内にコピーする
さらにvectorにリサイズが発生すると,全部コピーしなおすことになる.
vc8の実装では,push_back(X)は insert( end(), X);と定義されているので当然同じ回数のコピーコンストラクタが呼び出される…
if (it==v.end()) v.push_back(X); else v.insert( it, X);
で少しは改善できると思ったのに.
しかも複数サイズのコピー( void insert( iterator _Where, size_type _Count, const Type& _Val); )も同じ扱いなので,想像以上に大きな関数になっている.
複数サイズのコピー自体はコンパイラの最適化によって妥当なサイズに縮小される?
コンテナにオブジェクトの実体を入れるときは要注意だな.