空的 if 块没有优化掉?

Empty if-block not optimized away?

下面的空 if 块是否会被优化掉?

public class C 
{
    private bool foo = false;
    
    public void M() 
    {
        if(foo) {}
    }
}

SharpLab(master 2020 年 12 月 5 日,发布)表示编译器没有优化 if 块:

.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 块的想法是否正确?

提前致谢!

Further, the JIT ASM that SharpLab generates also does not seem to optimize the empty if-block away:

C.M()
    L0000: movzx eax, byte ptr [ecx+4]
    L0004: ret

实际的 if 块已被优化掉,如果它存在的话,它看起来与此相当:

C.M()
    L0000: movzx eax, byte ptr [ecx+4]
    L0004: test eax, eax
    L0006: je short L0008
    L0008: ret

但这并没有发生,JIT 编译器显然认为这没有用。

只有布尔字段的负载仍然存在。