上記の 2 つのオプションのうち、含まれていないこの 3 番目のオプションが最も効率的です。
std::vector<Obj> someVector;
someVector.reserve(preCalculatedSize);
for (int i = 0; i < preCalculatedSize; ++i)
someVector.emplace_back();
emplace_back
オブジェクトを、 が配置するメモリに直接構築しますvector
。利用前であればreserve
、再配置や移動を避けることができます。
ただし、オブジェクトが本当に大きい場合は、キャッシュ コヒーレンシの利点は少なくなります。したがって、vector
スマート ポインターの a は理にかなっています。したがって、4 番目のオプション:
std::vector< std::unique_ptr<Obj> > someVector;
std::unique_ptr<Obj> element( new Obj );
someVector.push_back( std::move(element) );
おそらく最高です。ここでは、データの有効期間と、オーバーヘッドがほぼゼロの同じ構造でデータにアクセスする方法を表し、同期が取れなくなるのを防ぎます。
移動したいときは、明示的に移動する必要がありstd::move
ます。std::unique_ptr
何らかの理由で生のポインターが必要な場合は、.get()
それにアクセスする方法です。 ->
およびはすべてオーバーライドされるため、実際に呼び出す必要が*
あるのは、.explicit operator bool
.get()
Obj*
これらのソリューションはどちらも C++11 を必要とします。C++11 がなく、オブジェクトが実際に大きい場合は、「データへのポインターのベクトル」が受け入れられます。
いずれにせよ、実際にすべきことは、モデルに最適なものを決定し、パフォーマンスをチェックして、実際にパフォーマンスの問題がある場合にのみ最適化を行うことです。