前段時間我讀了一些關於'內聯'的內容。 .Net編譯器會從小方法中注入代碼(內聯)以加快執行速度。有沒有可能來自被引用的dll的方法代碼在我自己的代碼中被內聯?
是否有可能來自被引用的dll的方法代碼在我自己的代碼中被內聯?
前段時間我讀了一些關於'內聯'的內容。 .Net編譯器會從小方法中注入代碼(內聯)以加快執行速度。有沒有可能來自被引用的dll的方法代碼在我自己的代碼中被內聯?
是否有可能來自被引用的dll的方法代碼在我自己的代碼中被內聯?
是的,這是可能的,在JITting時間。
不在編譯時。
這意味着您的程序集將只包含您編寫它的代碼,但是當它在運行時被打入本機機器代碼時,JIT編譯器可能會將來自其他程序集的小方法內聯到您自己的代碼中。
是的。如果您不使用ngen.exe預編譯程序集,則JIT編譯器可以自動內聯在程序集之間。
你能否解釋一下呢?我不熟悉ngen.exe。 – 2011-02-28 19:39:23
C#編譯爲IL代碼。當它在用戶的計算機上運行時,JIT或即時編譯器將其轉換爲機器代碼。有時候你想把它變成機器碼。爲此,您可以使用程序調用ngen或「本機圖像生成器」。 – 2011-03-01 02:34:11
http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx – 2011-03-01 02:34:33
準確地說,第
但是,如果DLL的庫可用(DLL代表動態鏈接庫,這是我們不能靜態鏈接),它可能會發生。
自動內嵌作爲優化的一個步驟,僅在很少使用的小函數或函數上執行,但總是在庫上執行。最後,靜態鏈接庫(Windows中的* .lib或Unix中的。a)可以複製到您的程序中,但動態鏈接庫(Windows中爲.dll或UNIX中爲* .so)噸。
在.NET或類似框架的情況下,故事有點不同。
這個問題被標記爲「c#」和「.net」,所以我認爲可以安全地假設Kees * *詢問.NET。 – Aaron 2011-02-28 19:41:26
是的......這是關於.Net dll的。儘管如此,這個觀察雖然不是主題,但卻是一個很好的觀察。 – 2011-02-28 19:43:45
它通常很有可能。 但你不能決定自己的,它的這決定了編譯器:
檢查:http://www.ademiller.com/blogs/tech/2008/08/c-inline-methods-and-optimization/
給定的鏈接討論一個二進制文件中的類,而不是關於引用的DLL中的類的權利? – 2011-02-28 19:42:25
這是對的,但特別是它的JIT編譯器誰做的,它應該爲我的理解發生相同 – fixagon 2011-02-28 19:44:38
所以我編譯的dll不會包含內聯代碼? – 2011-02-28 19:38:55
這是正確的,因爲在編譯期間從不會發生內聯,只有jitting。 – 2011-02-28 19:42:20
在Jonathan Allen的回答中談到ngen.exe編譯的情況? – 2011-02-28 19:46:52