0

最適化をオンにしてプロジェクトをコンパイルし、コードでどのような最適化が変更されたかを確認する方法。

例えば:

私の元のコード:

printf("Test: %d",52);
for (int empty=0;i<100000;i++) {
    //Nothing here
}

今、私が最適化を使ってコードをコンパイルするとき、私は見たいです:(私はそれがそのようになると思います)

printf("Test: 52");
4

1 に答える 1

5

コンパイラはしません最適化ソースコード(質問で示したもの)を変更しますが、asm命令で構成されるバイナリを変更します。

最適化のオンとオフを切り替える方法はコンパイラによって異なるため、コンパイラのドキュメントを参照する必要があります。

MSVSでは、上部のツールバーからこのオプションを選択できます。(最適化されてDebugいない)vs Release(最適化されている)を探します。デバッガーでコードをステップ実行し、右クリックして-> show dissasemblyを実行すると、バイナリコードを確認できます。

たとえば、コードは以下を生成します。

最適化なし:

    printf("Test: %d",52);
0097171E  mov         esi,esp  
00971720  push        34h  
00971722  push        offset string "Test: %d" (9788C8h)  
00971727  call        dword ptr [__imp__printf (97C3E0h)]  
0097172D  add         esp,8  
00971730  cmp         esi,esp  
00971732  call        @ILT+575(__RTC_CheckEsp) (971244h)  
    for (int i=0;i<100000;i++) {
00971737  mov         dword ptr [i],0  
0097173E  jmp         wmain+49h (971749h)  
00971740  mov         eax,dword ptr [i]  
00971743  add         eax,1  
00971746  mov         dword ptr [i],eax  
00971749  cmp         dword ptr [i],186A0h  
00971750  jge         wmain+54h (971754h)  
        //Nothing here
    }
00971752  jmp         wmain+40h (971740h)  

最適化あり:

    printf("Test: %d",52);
013A1000  push        34h  
013A1002  push        offset string "Test: %d" (13A20F4h)  
013A1007  call        dword ptr [__imp__printf (13A209Ch)]  
013A100D  add         esp,8  
    for (int i=0;i<100000;i++) {
        //Nothing here
    }
于 2012-08-01T22:24:58.050 に答える