c# - 是否在编译时从表达式中删除了冗余项

标签 c# optimization compilation

是否在编译时删除了表达式中的冗余项。

假设我有以下几行

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

编译器会把这些优化成简单的 a = b;

最佳答案

确实如此。您可以在 Debug -> Windows -> Disassembly 下打开 Visual Studio 中的反汇编程序,亲自查看。我写了这个:

        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);

并打开调试构建优化。在反汇编中我得到了这个:

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

关于c# - 是否在编译时从表达式中删除了冗余项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42869538/

相关文章:

c# - 使用请求 header 对 BasicHttpBinding 进行身份验证

powershell - 压缩 Azure Blob 存储中已有的图像

c - 使用按位运算编写 round() 函数?

c++ - 即使包含文件也编译错误

C++ 问题 : conflicting declaration

c# - 处理由另一个应用程序创建的 .dat 文件

c# - OData 客户端无法发送 Key 属性的空值

c# - 列表框.SelectedItem

c# - 如何使用 DateTime.ToString 提高代码的性能?

.NET const 影响编译的程序集大小