2016-01-19 28 views

回答

2

這是傳統x64抖動的問題。它使用NOP指令對齊的代碼。對齊代碼是一種優化策略,它使分支預測器更高效,並減少指令解碼器爲達到分支目標所做的工作。你可以看到這早在標題爲「英特爾64和IA-32體系結構 優化 參考手冊」一章3.4.1.5英特爾處理器手冊:

裝配/編譯器編碼規則12.(M衝擊,H一般性)所有分支 目標應該是16字節對齊的。

不幸的是,這些NOP現在是Thread.Abort()的一個可能的目標,允許線程在try/finally塊到達之前中止。隨着鎖定將被採取但不被釋放的不幸的結果。發生這種情況的可能性非常低,而不是零。

這不是一個完整的故事,afaik它只是抖動中的一個普通錯誤,因爲try塊在實踐中不是分支目標。傳統的x64抖動團隊還有其他嚴峻的問題,看起來就像他們的成員在工作完成後散佈並且已知的錯誤沒有得到修復。微軟創建了一個新團隊,他們重寫了抖動,項目名稱RyuJIT,並自.NET 4.6起可用。他們放棄了x64代碼庫,並以x86抖動代碼庫爲起點。

0

nop指令用於在非優化構建中放置斷點。

當我們運行未經過優化的構建時,只在調試模式下生成nop指令,如果我們使用優化標誌構建項目,那麼這些指令將不會生成IL。

+0

你的意思是「放置斷點」究竟是什麼意思?誰把斷點放在哪裏? –

+1

調試本機代碼 –

+0

我想你的意思是說編譯器會發出NOP指令,這些指令沒有任何與它們關聯的實際IL,但是你可能想要放置一個斷點。在http://www.panopticoncentral.net/2004/02/03/what-does-optimize-do/上找到 –