在编译时是否从表达式中删除了冗余术语

时间:2017-03-18 01:43:02

标签: c# optimization compilation

在编译时删除表达式中的冗余术语。

说我有以下几行

a = b / 1;
a = b * 1;
a = b + 0;
a = b - 0;
a = b << 0;
a = b >> 0;

编译器是否会将这些优化为a = b;

1 个答案:

答案 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,因为它从未被使用过。也许其他人可以解释它。