[英]Empty if-block not optimized away?
下面的空 if 塊會被優化掉嗎?
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 編譯器顯然發現這沒有用。
只有 boolean 字段的負載仍然存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.