如果块未优化,则为空



如果块被优化掉,下面的内容会为空吗?

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编译器显然发现这将毫无用处。

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

相关内容

  • 没有找到相关文章

最新更新