【发布时间】:2021-03-17 15:54:58
【问题描述】:
下面的空 if 块会被优化掉吗?
public class C
{
private bool foo = false;
public void M()
{
if(foo) {}
}
}
SharpLab(master 5 Dec 2020, Release)表示编译器没有优化 if-block away:
.method public hidebysig instance void M () cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldfld bool C::foo
IL_0006: pop
IL_0007: ret
}
编译器应该看不到ldfld后面跟pop没有效果,三个指令(ldarg.0也是)不需要发出?
我想不出在不发出 ldfld 时可能会发生的副作用(就像在 if 块内调用方法时可能发生的那样)。
此外,SharpLab 生成的 JIT ASM 似乎也没有优化空 if 块:
C.M()
L0000: movzx eax, byte ptr [ecx+4]
L0004: ret
我是否认为 JIT 仍会优化空的 if 块?
- 如果是这样,您能否解释一下为什么编译器不能这样做?
- 如果没有,为什么没有?
提前谢谢你!
【问题讨论】:
-
您是将此目标构建为发布版还是调试版?我认为在调试某些优化时我不会发生。
标签: c# optimization jit cil