C#編譯器會優化空的void方法嗎? 喜歡的東西編譯器是否放棄了空方法?
private void DoNothing()
{
}
由於基本上,沒有代碼被添加,從以DoNothing
調用堆棧,並再次刪除它,豈不是更好地優化這個叫走一邊跑?
C#編譯器會優化空的void方法嗎? 喜歡的東西編譯器是否放棄了空方法?
private void DoNothing()
{
}
由於基本上,沒有代碼被添加,從以DoNothing
調用堆棧,並再次刪除它,豈不是更好地優化這個叫走一邊跑?
C#編譯器會優化空的void方法嗎?
不,他們仍然可以通過反射訪問,所以重要的是方法本身保持。
任何呼叫站點都可能包含呼叫 - 但JIT可能會優化它們。這樣做的狀況更好。它基本上是內聯的一個特例,內聯代碼是空的。
需要注意的是,如果你把它放到另一個對象:
foo.DoNothing();
這不無操作,因爲它會檢查foo
是非空。
從來沒有。編譯器不需要處理什麼是空的或沒有寫入。它就是你寫的,你在你的MSIL中。您可以點擊此處查看在ILDASM
如果你願意,你可以攔截針對每個項目後生成事件並運行IL檢查工具,將反映您生成的DLL,在你的類型檢查每一個MethodInfo並請求它的IL查找空IL模式,例如僅NoOp IL指令,並刪除不需要的方法。
例如: var ilBytes = SomeMethodInfo.GetMethodBody()。GetILAsByteArray();
一個好的混淆工具將以這種方式「修剪」方法。 preemptive.com/products/dotfuscator/features#pruning - 韋斯頓5分鐘前
你可以使用外部工具的Visual Studio中找到空的方法,並從他們的定義或使用的文件刪除它們
。一個好的混淆工具將以這種方式「修剪」方法。 http://www.preemptive.com/products/dotfuscator/features#pruning – weston 2015-02-11 08:58:15
你說得很好,謝謝評論:) – 2015-02-11 09:08:26
啊,我沒有想到null調用方法,因此失敗 – 2015-02-11 09:53:03