2011-06-09 74 views
7

題目問這一切,實際上,不過,方法全面考慮的最大數量:什麼是每個.NET類

嗨,我在.NET平臺上編寫一個小哨編譯工具,在嘗試優化它時,我遇到了一個我可以從ECMA標準的公共語言基礎結構(CLI)中很難找到答案的問題。

什麼是方法的最大#一個類可以有?有限制嗎?

編輯

感謝凱爾西的指出,以現實生活中的考驗。 雖然我還是會關心實際的限制是什麼,對我的實際現實生活的目的, 我想知道這是否是2^16/2^32 - 或 - 2^31-1,因爲他指出,這似乎是每類明顯高於64K的方法..

+1

你在做什麼,知道這一點很重要? – Sven 2011-06-09 15:30:16

+5

如果你達到最大值,那麼你做錯了! – 2011-06-09 15:31:12

+4

我不同意@科林的評估。鑑於OP正在編寫一個後編譯處理工具(?),這實際上是一個合理的問題,並根據確切的問題進行優化,其中方法的數量在內部存儲爲「short」或「byte」,而不是「int」(說)可能是有意義的(當然,這將是絕對的例外,但讓我們給懷疑的好處)。 – 2011-06-09 15:35:42

回答

5

有趣的問題,但不知道爲什麼你會不會打了極限在現實中這樣的答案可能不是那麼有用,因爲它是一個高數字。

我發現這個thread如果有人寫了下面的測試,以實際創建一個類增加的功能數量,看看那裏的突破點是:

namespace MethodCountLimitFinder 
{ 
    class Program 
    { 
     [System.STAThreadAttribute] 
     static void Main (string [] args) 
     { 
      Microsoft.CSharp.CSharpCodeProvider provider = 
       new Microsoft.CSharp.CSharpCodeProvider() ; 
      System.CodeDom.Compiler.CompilerParameters cp = 
       new System.CodeDom.Compiler.CompilerParameters() ; 
      cp.GenerateExecutable = false ; 
      cp.GenerateInMemory = true ; 
      System.CodeDom.Compiler.CompilerResults cr = null ; 
      System.Text.StringBuilder inner = 
       new System.Text.StringBuilder ("namespace Tester { class Test {") ; 

      int methodCount = 1000000 ; 
      while (true) 
      { 
       System.Console.WriteLine (methodCount) ; 

       for (int i = methodCount ; i > 0 ; i--) 
       { 
        inner.AppendFormat ("void M{0}(){{}}\n" , methodCount++) ; 
       }  
       inner.Append ("}}") ;     
       cr = provider.CompileAssemblyFromSource (cp , inner.ToString()) ; 
       if (cr.Errors.Count > 0) 
       { 
        break; 
       }     
       inner.Remove (inner.Length - 2 , 2) ; 
      } 
      foreach ( System.CodeDom.Compiler.CompilerError ce in cr.Errors) 
      { 
       System.Console.WriteLine (ce.ToString()) ; 
      } 
     } 
    } 
} 

基於它看起來像它的結果是資源依賴,而不是那些很難定義的規範,除非你將它綁定到32/64位索引引用或者我認爲不現實的東西,因爲你可能會首先遇到資源限制。

測試拿到過20萬+資源不足而失敗由於之前。

此外,有趣的,但不是所有的有用信息IMO。

+0

這可能會達到極限在接近每個類或程序集的方法限制之前,AppDomain(或Win32進程中的模塊)中的(動態)程序集的數量。 – Richard 2011-06-09 15:53:31

+0

我甚至在乎的原因是因爲我試圖創建一個快速查找結構,我基本上需要儘可能緊湊地存儲一個索引到一個數組方法和一個計數。如果我可以假設它們都是16位(方法限制爲16位),我可以將它們都打包成一個32位的值(即startIdx | count << 16) – damageboy 2011-06-09 16:00:29

2

我認爲你需要通過非託管接口尋找到了CLR的元數據的定義結構來限制這些結構的大小。這個answer(和評論)已經注意到這是每個程序集(不是類型)大約1600萬(24位索引)方法。

替代地認爲反射方法返回陣列,且有1GB的每當前.NET運行時對象的限制,因此,最大將是1024^3/sizeof(MethodIndo)