数组的大小是不是受int(2147483647)的上限限制?我正在做一些ProjectEuler练习,我遇到了一个场景,我想要一个大于2,147,483,647(C#中int的上限)的数组。当然这些都是大数组,但是,例如,我不能这样做//failsbool[]BigArray=newBigArray[2147483648];//同样失败,无法将uint转换为intArrayListBigArrayList=newArrayList(2147483648);那么,我可以拥有更大的阵列吗?编辑:这是阿特金筛子,你知道,所以我只想要一个非常大的筛子:D每当你使用那么大的数组时,你应该尝试找到一个更好的解决方案来解决你的问题。但话虽如此,我仍然会尝试回答你的问题。如本文所述,.Net中的任何对象都有2GB的限制。适用于所有x86、x64和IA64。与32位Windows操作系统一样,在64位Windows操作系统上运行64位托管应用程序时,可以创建的对象大小限制为2GB。此外,如果您定义的数组在堆栈上太大,则会出现堆栈溢出。如果你在堆上定义一个数组,它会尝试将它分配到一个大的连续块中。最好将ArrayList与堆上的隐式动态分配一起使用。这不会让你超过2GB,但可能会让你更接近它。我认为堆栈大小限制只有在使用x64或IA64架构和操作系统时才会更大。使用x64或IA64,您将拥有64位而不是32位的可分配内存。如果你不能一次性分配arraylist,你可以分配它。在具有6GBRAM的x64Windows2008机器上使用ArrayList并一次添加1个对象,我可以获得的ArrayList的最大大小是:134217728。所以我真的认为你必须找到一个更好的解决方案来解决你的问题而不使用尽可能多的内存。也许写入文件而不是使用RAM。即使在64位上,数组限制也固定为int32。单个对象的最大大小限制。但是,您可以轻松获得漂亮的大锯齿状数组。更差;因为在x64中引用更大,所以对于引用类型数组,您实际上在单个数组中获得的元素更少。请参阅此处:我收到一些关于为什么64位版本的2.0.Net运行时仍然对数组有2GB最大大小限制的问题。鉴于这似乎是一个热门话题,我考虑了一些背景知识并按顺序讨论了解决此限制的选项。首先是一些背景;在.Net运行时(CLR)的2.0版中,我们做出了有意识的设计决定,即使在运行时的64位版本上,也将GC堆中允许的最大对象大小保持在2GB。这与32位CLR的当前1.1实现相同,但您很难真正设法在32位CLR上分配一个2GB的对象,因为虚拟地址空间太零散而无法实际找到2GB孔。通常人们并不特别关心在实例化(或任何接近)时创建>2GB的类型,但由于数组只是在托管堆中创建的一种特殊托管类型,因此它们也受此限制。需要注意的是,在.NET4.5中,gcAllowVeryLargeObjects标志可以选择性地移除内存大小限制,但是,这不会改变最大维度大小。关键是,如果您有自定义类型的数组或多维数组,您现在可以超过2GB的内存大小。你根本不需要大数组。当你的方法遇到资源问题时,不要只看如何扩展资源,也要看方法。?这是一个使用3MB缓冲区的类,使用Eratosthenes筛法计算素数。此类会跟踪您计算素数的距离,当它需要扩展范围时,它会创建一个缓冲区来测试另外300万个数字。它将找到的素数保存在列表中,并在扩展范围时使用先前的素数排除缓冲区中的数字。我做了一些测试,大约3MB的缓冲区是最有效的。publicclassPrimes{privateconstint_blockSize=3000000;私有列表_primes;私人长_next;publicPrimes(){_primes=newList(){2,3,5,7,11,13,17,19};23;}privatevoidExpand(){bool[]sieve=newbool[_blockSize];foreach(longprimein_primes){for(longi=((_next+prime-1L)/prime)*prime-_next;i=_primes.Count){Expand();}返回_primes[索引];我相信即使在64位CLR中,每个对象也有2GB的限制(或者可能是1GB-我不能记住)。这会阻止您创建更大的数组。Array.CreateInstance仅接受Int32参数作为大小的事实也具有暗示性。更广泛地说,我怀疑如果您需要大型数组,您应该真正改变处理方法的方式问题。我是C#的新手(即本周学习它),所以我不确定ArrayList是如何实现的确切细节。但是,我猜你没有为ArrayList示例定义类型,那么array将被分配为对象引用数组。这可能意味着您实际上分配了4-8Gb内存,具体取决于体系结构。根据MSDN,字节数组的索引不能大于2147483591。它也是4.5之前的.NET数组的内存限制。在.NET4.5中,这个最大值是相同的,但对于其他类型,它高达2146435071。这是用于说明的代码:以上是C#学习教程:数组的大小是否受制于int的上限(2147483647)?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—staticvoidMain(string[]args){//-------------------------------------------//Pre.NET4.5或gcAllowVeryLargeObjectsunsetconstinttwoGig=2147483591;//来自.NET的幻数vartype=typeof(int);//要使用的类型varsize=Marshal.SizeOf(type);//类型大小varnum=twoGig/size;//最大元素数vararr20=Array.CreateInstance(type,num);vararr21=newbyte[num];//----------------------------------------------//.NET4.5与x64和gcAllowVeryLargeObjects设置vararr451=newbyte[2147483591];vararr452=Array.CreateInstance(typeof(int),2146435071);vararr453=新字节[2146435071];//另一个幻数return;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
