1

重複の可能性:
C++ で配列または std::vectors を使用すると、パフォーマンスのギャップはどのくらいですか?
std::vector は単純な配列よりもはるかに遅いですか?

メモリは 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ループの時間を比較すると、アクセスに必要な時間はベクトルに比べて非常に小さい

なぜですか?どちらも一定でほぼ同じ時間がかかると思ったので..

4

3 に答える 3

5

ほとんどの (すべてではないにしても) の実装は内部的に配列をstd::vector使用するため、最適化フラグが設定されている場合T*、演算子を使用してベクトル要素と C 配列要素にアクセスする間にパフォーマンスの違いはまったくないはずです。[]コンパイラの最適化フラグを使用してテストを再試行してください。

ただし、このstd::vector<T>::at関数は境界チェックを実行するため、関数を使用する場合はそうではない場合があります。

于 2010-10-17T03:44:48.700 に答える
4

これは通常、コンパイラをインライン関数に設定したかどうかに (ほぼ完全に) 依存します。std::vector関数 ( という名前operator[]) を使用してアイテムに対処します。その関数がインラインで生成されない場合、関数を呼び出すオーバーヘッドにより、配列内の項目のアドレス指定にかかる時間が大幅に増加します。インライン関数を生成するようにコンパイラを設定した場合、通常、2 つの間の意味のある違いを測定することはできません。

于 2010-10-17T03:54:29.753 に答える
0

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

于 2010-10-17T03:40:54.853 に答える