在编译时删除表达式中的冗余术语。
说我有以下几行
a = b / 1;
a = b * 1;
a = b + 0;
a = b - 0;
a = b << 0;
a = b >> 0;
编译器是否会将这些优化为a = b;
答案 0 :(得分:3)
确实如此。您可以在Debug
- &gt;下的Visual Studio中打开反汇编程序。 Windows
- &gt; Disassembly
亲眼看看。我写了这个:
int a, b;
a = Convert.ToInt32(Console.ReadLine());
b = a / 1;
b = a * 1;
b = a + 0;
b = a - 0;
b = a << 0;
b = a >> 0;
Console.WriteLine("{0}", b);
并启用了Optimization for Debug构建。在反汇编中我得到了这个:
000007FE974040F4 E8 F7 62 D1 5E call 000007FEF611A3F0
000007FE974040F9 89 45 E4 mov dword ptr [rbp-1Ch],eax
000007FE974040FC 8B 4D E4 mov ecx,dword ptr [rbp-1Ch]
000007FE974040FF 89 4D EC mov dword ptr [rbp-14h],ecx
b = a / 1;
000007FE974242C2 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242C5 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a * 1;
000007FE974242C8 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242CB 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a + 0;
000007FE974242CE 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242D1 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a - 0;
000007FE974242D4 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242D7 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a << 0;
000007FE974242DA 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242DD 89 4D E8 mov dword ptr [rbp-18h],ecx
b = a >> 0;
000007FE974242E0 8B 4D EC mov ecx,dword ptr [rbp-14h]
000007FE974242E3 89 4D E8 mov dword ptr [rbp-18h],ecx
您可以看到每行的汇编说明完全相同,只是将a
复制到b
六次。实际上,我很惊讶它并没有将整个事情优化为单b=a
条指令。如果我注释掉它Console.WriteLine
:
000007FE974041D4 E8 17 62 D1 5E call 000007FEF611A3F0
000007FE974041D9 89 45 E8 mov dword ptr [rbp-18h],eax
000007FE974041DC 8B 45 E8 mov eax,dword ptr [rbp-18h]
000007FE974041DF 89 45 EC mov dword ptr [rbp-14h],eax
b = a / 1;
000007FE974041E2 90 nop
b = a * 1;
b = a + 0;
b = a - 0;
b = a << 0;
b = a >> 0;
// Console.WriteLine("{0}", b);
}
000007FE974041E3 90 nop
虽然在 的情况下,我很惊讶它并没有完全优化b
,因为它从未被使用过。也许其他人可以解释它。