2011-07-20 19 views
5

如果我編寫(或使用)泛型類,例如列出並使用兩種不同枚舉類型對其進行參數化,我會得到兩個JITted代碼副本嗎?鑑於以下文章討論了JI​​Tter如何爲引用類型生成一個副本,併爲每個值類型生成了一個副本,我認爲這歸結爲:「爲了JITting的目的,每個特定的枚舉都被視爲不同的值類型?.NET JIT編譯器是否爲不同的枚舉生成了泛型參數化的不同代碼?

CLR vs JIT

http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic1

在C#代碼:

using System.Collections.Generic; 

namespace Z 
{ 
    class Program 
    { 
     enum A {a} 
     enum B {b} 
     class C<T> 
     { 
     } 

     static void Main(string[] args) 
     { 
      var x = new C<A>(); 
      var y = new C<B>(); // does this JIT a new C constructor for enum type B? 
     } 
    } 
} 

我想知道這在一般情況下,還專門爲.NET CF 3.5(Windows CE的)JIT編譯器(編輯:因爲我對可能的代碼膨脹影響感興趣)。有什麼建議可以找到最好的方法?我正在考慮在C類中編寫一個函數,將P /調用到本地代碼中,我可以打開調試器並檢查callstack - 特別是返回地址,但也許有人可以根據語言規則進行權威性回答, m不知道...

+2

我猜測每個底層整型只有一個實例化,但我很樂意聽到權威的答案。 –

+2

是的。我們應該添加哪些標籤來吸引Eric Lippert的注意力? – 2011-07-20 21:53:14

+0

'fabulous-adventures-in-coding',我認爲 –

回答

5

因此,我繼續前進,並提出一個P/Invoke函數來調用一個C <T>。測試函數。我在本地函數中插入了調試器(支持託管調試和本地調試的桌面窗口),然後放到程序集中,然後從我的本地函數中追蹤RET指令。 RET之後的EIP(指令指針)與返回到兩個不同的例程一致,一個用於C <A>。測試,另一個用於C <B>。測試。通過這兩個函數對通用原生函數(通過我的斷點)進行多次調用顯示了一致的結果。此外,後RET EIPs是0x2E0246和0x2E02BE,它們彼此靠近,也沒有映射到加載的DLL的地址空間。這表明它們被打亂了,並且在時間上彼此靠近,並且JITted方法的大小很小(如預期的那樣)。

因此,至少對於桌面系統來說,答案是泛型以不同的例程模板化了不同的枚舉JIT。

相關問題