空的 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 编译器显然认为这没有用。
只有布尔字段的负载仍然存在。
下面的空 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 编译器显然认为这没有用。
只有布尔字段的负载仍然存在。