2011-06-09 77 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)