2017-10-23 1 views
2

私のリソース(かなり大きい)を扱うclass Aがあります。今私はこれらのベクトルが必要ですstd::vector<A> vec_of_A (3, A(int N))。問題は、vectorがまずテンポラリオブジェクトA(int N)を作成し、その3回からコンストラクトをコピーして、その一時オブジェクトを破棄することです。私のA(int N)はかなり大きなメモリを割り当てているので、私は実際に必要とするメモリ量よりも33%も多いメモリ要件で(一時的に)終了します。ベクターを構築するときに不要なコピーを取り除くにはどうすればいいですか?

vectorAの作成方法不要なコンストラクタを避けていますか? (私のclass Aは5のすべてのルールを満たしています)。

EDIT:ごめんなさいデフォルト構成のオブジェクトAの重要性を認識していませんでした。私の質問ではない既定のコンストラクタがパラメータ化されたコンストラクタについてです。

+0

いつでもデータ構造にA *を格納することができます。 –

+2

コードスニペットは意味ですか? 'A'引数をデフォルトで構築していますか? – StoryTeller

+0

@PhilipBrackポインタを使用する特別な理由がない場合、それは意味がありません。値セマンティクスがOPのために機能する場合、(より多くの)動的な割り当てと間接化のためにオーバーヘッドの余分なレイヤーに物事を置くことはありません。結局のところ、指摘された「A」はまだ構築される必要があります。 –

答えて

9

あなただけsome_numberデフォルトの項目が作成されます

std::vector<A> vec_of_A(some_number); 

を使用することができます。

項目がデフォルトで構築可能でない場合は、必要なスペースをreserveに置き換えて、emplace_backを使用して要素を適切に構築します。そのように見える

std::vector<A> vec_of_A; 
vec_of_A.reserve(some_number); 
for (int i = 0; i < some_number; ++i) 
    vec_of_A.emplace_back(/*constructor parameter(s) here */); // construct an object 
1

は、初期の一時オブジェクトからコピーする必要はありません3デフォルト・構築アイテムとベクトルを埋めるためにstd::vector::resize()メソッドを使用します。あなただけのベクトル内のオブジェクトを構築デフォルトにしたい場合は

std::vector<A> vec_of_A; 
vec_of_A.resize(3); 
関連する問題