2012-10-01 68 views
5

我想了解無處不在的JIT內聯可以如何。JIT內聯可以將我的代碼內聯到一些.NET運行時彙編代碼中嗎?

假設在我的代碼中,我調用了System.IO程序集中的某個函數,並將回調引用傳遞給我的代碼中實現的函數,以便從System.IO函數中調用該函數。在我的功能有GetCallingAssembly()調用。因此,如果我的回調內嵌到System.IO中,原來在我的代碼中並打算說從當地System.IO內部調用「當前」方法的GetCallingAssembly()的調用將會說它現在是從我的代碼中調用的。

這樣的內聯是可能的還是.NET運行時程序集處理方式不同,因此JIT將用戶代碼內聯到.NET運行時代碼中是不允許的?

+1

委託回調將如何內聯到回調調用程序?我不確定這是否有道理......?我的理解是,內聯僅限於要調用的代碼是**可證明**的場景 - 即靜態調用或對非虛擬方法的虛擬調用。 –

+0

@Mark Gravel:如果知道這是整個程序中回調調用程序的唯一調用,爲什麼不能呢? – sharptooth

+0

我懷疑*比JIT將要做的更努力去理解,尤其是因爲反射/元編程存在(意思是說:新的調用者可能晚點存在) –

回答

3

您可以放心地假定回調不會被內聯。在安裝時,.NET Framework程序集總是由ngen.exe預先拼寫的,因此沒有選項可以在之後修改該代碼。此外,即使抖動優化器能夠推斷代理的目標方法可能是什麼,通過代理的回調也不會內聯。

相關問題