是否在编译时删除了表达式中的冗余项。
假设我有以下几行
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/