網上有很多文章列出了在執行一段代碼之前C#JIT所做的優化。例如this post MSDN上談到:C#JIT編譯器是否優化了空檢查?
常量摺疊,常量和複製傳播,普通的子表達式 消除,循環不變,死存儲和死碼 消除代碼運動,寄存器分配,方法內聯,循環展開 (帶小體的小環)。
我的問題是:JIT編譯器是否也處理無用的空檢查?我無法找到任何來源來處理這個問題。
在同一篇文章我讀:
,因爲C#語言規範確保了空 對象引用任何調用拋出一個NullReferenceException,每次調用站點必須 確保實例不爲空。這是通過取消引用 實例引用完成的;如果它爲空,它將產生一個故障,即 變成此異常。
因此,假設我寫一段代碼是這樣的:再次
if (person != null)
{
Console.WriteLine(person.Name);
}
的person.Name
調用第二空檢查是克利裏沒用,編譯器可以將其刪除。或不?
,我讀了在Java中,這是已經完成(很多here,here和here之間的一些消息來源)。
如果C#也這樣做,你知道一些來源或文件談論?
如果C#沒有這樣做,你知道爲什麼嗎? Java JIT沒有遇到的.NET環境中實現這樣的功能是否存在固有的困難?
僅作爲正常優化的副作用,如死碼消除。這應該是非常罕見的。一般來說,抖動優化器對執行空指針檢查的代碼沒有特別的瞭解,並將指針視爲易失性。在任何具有垃圾收集器的虛擬機中非常重要,該收集器在壓縮堆時任意修改指針。值得注意的是,C#編譯器本身可以消除檢查,當你使用elvis操作符('?.')時它會這樣做。 –