2011-12-06 6 views
1

コンパイラがインデックスとイテレーションを使って反復に同等のコードを生成するかどうかを確認する方法はありますか?コードのための すなわちいくつかのテストでは、インデックスを使用してポインタと反復を使用して反復のために生成されたコードが異なるかどうかを確認しますか?

void f1(char v[]) 
    { 
     for(int i=0; v[i]!=0;i++) use(v[i]); 
    } 

void f1(char v[]) 
    { 
     for(char *p = v; *p!=0; p++) use(*p); 
    } 

私は私のコンパイラなどのMicrosoft Visual C++を使用......

助けてください.....

+1

v [i]!= 0および* p!= 0は、未定義の動作を引き起こす可能性があります。配列の長さを使用して、配列の終わりを確認します。 – vrbilgi

答えて

2
  1. 関数にブレークポイントを設定します。
  2. デバッグ情報を有効にして、リリースでコンパイルすることを確認します(そうでない場合は、確かに異なります)。
  3. 実行してください。
  4. アセンブリウィンドウを開いて、生成されたアセンブリ(通常はAlt + 8)を表示します。
1

私はしばらくの間はVisual Studioを使用していませんが、あなたが比較できるアセンブラファイルを作成するオプションがあるはずです。

それ以外の場合は、関数の各バージョンで1つずつ、2つのCファイルを作成し、そのファイルからオブジェクトファイルを作成することができます。その後、逆アセンブラを使用してアセンブラコードを取得し、2つのファイルを比較します。

関連する問題