2

この質問は以前に尋ねられたものと似ていますが、メモリページングは​​考慮されていないと思います。だから、私はここで再び同様の質問を提起しています:

// version 1
int nums[100];
int* pNum = nums;
for(int i=0;i<100;i++,pNum++){
  foo(pNum);
}

// version 2
for(int i=0;i<100;i++){
  foo(nums[i]);
}

どのバージョンが速いでしょうか?以前は、両方のバージョンでメモリアドレスの位置をインクリメントする必要があるため、生成されたアセンブリコードは非常に似ていると言われていましたが、非常に大きな配列を考慮すると、メモリページングのパフォーマンスは大幅に変化しますか?それらの1つはタイプロングシフトを必要としますが、他の1つは配列のベースメモリアドレスからのシフトを必要とするので?プラットフォーム/コンパイラに非常に依存していることは知っていますが、それでも人々の一般的な慣習、特に画像処理や科学計算などの大規模なデータ型での作業について知りたいですか?ありがとう。

4

2 に答える 2

5

一般的なコンセンサスは、プリミティブ型には違いがないということです。ほとんどのコンパイラは、これに対してまったく同じコードを生成します (おそらくfoo(*pNum).

于 2012-07-12T01:20:46.117 に答える
1

私はそれがプラットフォーム/コンパイラに大きく依存していることを知っています

丁度

しかし、特に画像処理や科学計算のような大規模なデータ型を扱う人々の一般的な慣行を知りたいですか? ありがとう。

ベクトルと反復子を使用する場合と同様に、どちらの方法も一般的です。圧倒的に無関係である可能性が高い何かについて心配しています。アルゴリズムを頭の中で視覚化する方法を最もよく表現するものを使用してください。これにより、保守と正確な進化が容易になります。

于 2012-07-12T01:45:59.167 に答える