コードがコンパイラによって最適化されている場合、両方とも同じである必要があります。最適化の意味を説明するために、MSVC 10 で記述されたサンプル コードを次に示します。
int x = 0;
while(true) // for(;;)
{
x +=1;
printf("%d", x);
}
デバッグ モード (最適化 (/Od) なし) でビルドすると、逆アセンブリで明確な違いが示されます。true
状態については、内に追加の指示がありwhile
ます。
while(true)
00D313A5 mov eax,1 //extra
00D313AA test eax,eax //extra
00D313AC je main+39h (0D313B9h) //extra
{
x +=1;
00D313AE mov eax,dword ptr [x]
00D313B1 add eax,1
00D313B4 mov dword ptr [x],eax
printf("%d", x);
...
}
00D313B7 jmp main+25h (0D313A5h)
for(;;)
{
x +=1;
00D213A5 mov eax,dword ptr [x]
00D213A8 add eax,1
00D213AB mov dword ptr [x],eax
printf("%d", x);
...
}
00D213AE jmp main+25h (0D213A5h)
ただし、コードをリリース モード (デフォルトの最大速度 (/O2)を使用) でビルドすると、両方で同じ出力が得られます。両方のループが 1 つのジャンプ命令に削減されます。
for(;;)
{
x +=1;
01291010 inc esi
printf("%d", x);
...
}
0129101C jmp main+10h (1291010h)
while(true)
{
x +=1;
00311010 inc esi
printf("%d", x);
...
}
0031101C jmp main+10h (311010h)
どちらを使用しても、速度の最適化がオンになっているまともなコンパイラには関係ありません。