SOのコピーコンストラクター/代入演算子についてはすでにかなりの数の質問がありますが、私の問題に合う答えは見つかりませんでした。
私は次のようなクラスを持っています
class Foo
{
// ...
private:
std::vector<int> vec1;
std::vector<int> vec2;
boost::bimap<unsigned int, unsigned int> bimap;
// And a couple more
};
現在、(プロファイルデータに基づいて)かなり過剰なコピーが行われているようです。それで、私の質問は、これに最もよく取り組む方法ですか?
カスタムコピーコンストラクタ/代入演算子を実装してスワップを使用する必要がありますか?または、独自のスワップメソッドを定義し、割り当ての代わりにそれを(適切な場合)使用する必要がありますか?
私はC++の専門家ではないので、この状況を適切に処理する方法を示す例を高く評価します。
更新:私はひどく明確ではなかったようです..説明しようと思います。このプログラムは基本的にオンザフライの幅優先探索プログラムであり、実行されるステップごとに、ステップ(Foo
クラス)に関するメタデータを格納する必要があります。問題は、(通常は)指数関数的なステップがあることです。したがって、これらのオブジェクトを多数保存する必要があることを想像できます。私が知る限り、常に(const)参照を渡します。グラフのノードから後継を計算するたびに、作成して保存する必要があります。 1つのFooオブジェクト(ただし、この後続の処理では、一部のデータメンバーがこの1つのfooに追加されます)。
私のプロファイルデータは、おおよそ次のようなものを示しています(このマシンには実際の番号がありません):
SearchStrategy::Search 13s
FooStore::Save 10s
したがって、グラフを検索するのと同じくらい多くの時間をこのメタデータの保存に費やしていることがわかります。ああ、FooStoreはに保存Foo
しgoogle::sparse_hash_map<long long, Foo, boost::hash<long long> >
ます。
コンパイラはg++4.4またはg++4.5です(私は開発マシンにいないので、現時点では確認できません)。
UPDATE 2構築後、メンバーの一部を次のようなFooインスタンスに割り当てます。
void SetVec1(const std::vector<int>& vec1) { this->vec1 = vec1; };
明日は、これをスワップ方式を使用するように変更する必要があると思います。これにより、間違いなくこれが少し改善されるはずです。
達成しようとしているセマンティクスが完全に明確でない場合は申し訳ありませんが、その理由はよくわからないためです。
よろしく、
モーテン