2017-02-13 4 views
2

注:パフォーマンスはアプリケーションで非常に重要です! 再割り当てを避けるためには、最悪のシナリオで十分なバッファストレージを割り当てる必要があります。この時私はstd :: vector +自分自身のサイズ変数を使うべきでしょうか?

ルックは、これは私が通常のstd ::ベクトルを使用する方法である:私はのstd ::ベクトルを使用+ +私自身のサイズ変数またはSTDのサイズを変更する必要があり、私は、意思決定の問題を抱えている

//On startup... 
unsigned int currVectorSize = 0u; 
std::vector<MyStruct> myStructs; 
myStructs.resize(...); //Allocate for the worst case scenario! 

//Each frame, do this. 
currVectorSize = 0u; //Reset vector, very fast. 

run algorithm... 
//insert X elements in myStructs if condition is met 
myStructs[currVectorSize].member0 = ; 
myStructs[currVectorSize].member1 = ; 
myStructs[currVectorSize].member2 = ; 
currVectorSize++; 

run another algorithm... 
//insert X elements in myStructs if condition is met 
myStructs[currVectorSize].member0 = ; 
myStructs[currVectorSize].member1 = ; 
myStructs[currVectorSize].member2 = ; 
currVectorSize++; 

Another part of the application uses myStructs and currVectorSize 

を::ベクトル+予備+ push_back +クリア+サイズ?

私は別のサイズの変数を浮動させたくありませんが、clear()関数は遅く(リニア時間)、push_back関数には境界チェックのオーバーヘッドがあります。デストラクタを呼び出したり、線形時間で動作させたりすることなく、フレームごとに一定の時間内にサイズ変数をリセットする必要があります。 結論:私は私の古いデータを破壊したくない、私はちょうど現在のサイズ/現在の数を挿入する要素を各フレームの変数をリセットする必要があります。

+3

あなたのオブジェクトが簡単に破壊可能である場合、 'clear()'は一定の時間でなければなりません。最もパフォーマンスの高いものが既に分かっているように聞こえます(ただし、それをプロファイルしてください!)ので、スピード/パフォーマンスを最適化しているなら、あなたはすでにあなたの答えが分かっています。 – Cornstalks

+0

これは、この特定のケースでこれを実行する最善の方法だと思います。 clear関数について:はい、POD型では一定であるべきですが、異なるコンパイラ...あなたはわかりません... – karl88

答えて

0

パフォーマンスが重要な場合は、可能な限りすべてをプロファイルする必要があります。

事前に再割り当てする必要がないことを確認することができれば、自分でサイズ変数を使用することができます。これはなぜstd::vectorを使うのですか?配列またはstd::arrayを使用してください。

それ以外の場合(再割り当てが行われる可能性があります)、サイズ変数を実際のベクターサイズと比較する必要がありますので、これはほとんど同じことになります。push_backは何もしません。

folly::fbvectorのようにvectorのいくつかの調整済み/最適化された実装もありますが、そのようなものが必要かどうかは慎重に考慮する必要があります。

ベクトルをクリアするには、vector::resizeをチェックしてください。実際には、イテレータの無効化のためにサイズを変更している場合は、再割り当てしないことが保証されています。だから、clearの代わりにresize(0)と呼ぶことができます。

+0

はい、再割り当ては私のアプリケーションでは起こりません。私はおそらく、std :: vectorの代わりにstd :: arrayを使用します。アドバイスのおかげです。 – karl88

関連する問題