1


0

配列へのアクセスはベクターへのアクセスよりも高速ですか?

メモリは1000要素のベクトルですarray []は1000要素の整数配列です

for (iteration = 0; iteration < numiterations; iteration++) {
    for (j = 1; j < numints; j++) {
       memory[j] += memory[j - 1];
       //array[j] += array[j - 1];
    }
}

100回の反復を実行した後、forループの時間を比較すると、アクセスに必要な時間はベクターの時間と比較して非常に短いです

どうしてですか? 両方とも一定の時間とほぼ同じ時間がかかると思ったからです。

3 Answer


5


(すべてではないにしても)ほとんどの `std

vector`の実装は内部で` T * 配列を使用するため、 [] `演算子を使用してベクター要素とC配列要素にアクセスする際にパフォーマンスの違いはありません。最適化フラグが設定されている場合。 コンパイラの最適化フラグを使用して、テストを再試行してください。

ただし、この関数は境界チェックを実行するため、 `std

vector :: at`関数を使用する場合はそうではありません。


4


これは通常、コンパイラをインライン関数に設定したかどうかに(ほぼ完全に)依存します。 `std

vector`は(` operator [] `という名前の)関数を使用してアイテムをアドレス指定します。 その関数がインラインで生成されない場合、関数を呼び出すオーバーヘッドにより、配列内の項目をアドレス指定するのにかかる時間がかなり長くなります。 インライン関数を生成するようにコンパイラを設定した場合、通常、2つの間の有意な差を測定することはできません。


0


確かに、それらは両方とも一定の時間です。 ただし、ベクトルはオブジェクトであり、関数呼び出しのリダイレクトにはペナルティがあります。 これをC ++演算子のオーバーロードの最初の経験と考えてください。 ベクトルクラスは[]演算子をオーバーロードして、実際の配列で同様のセマンティクスを実現します。