簡體   English   中英

沒有優化的空 if 塊?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM