如果块被优化掉,下面的内容会为空吗?
public class C
{
private bool foo = false;
public void M()
{
if(foo) {}
}
}
SharpLab(master 5 Dec 2020,Release(表明编译器没有优化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块,这是对的吗?
- 如果是,你能解释一下为什么编译器不能做到这一点吗
- 如果没有,为什么没有呢
提前谢谢!
此外,SharpLab生成的JIT ASM似乎也没有优化空if块:
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编译器显然发现这将毫无用处。
只有布尔字段的负载仍然存在。