C# 以最大大小声明的数组在C中抛出OutOfMemoryException#

C# 以最大大小声明的数组在C中抛出OutOfMemoryException#,c#,arrays,data-structures,C#,Arrays,Data Structures,我知道类似的问题已经被问了很多次,也得到了回答。 互联网上的许多文章只指向一个答案,即。int值或2147483647的最大值 内联是stackoverflow的两个链接: 然而,当我试图检查相同的异常时,抛出了一个OutOfMemoryException。事实上,我试着将大小减少2倍到1073741823(抛出异常),将大小减少4倍到536870911(抛出异常),将大小减少8倍到268435455(程序执行良好,没有任何异常) 测试代码: using System; namespace

我知道类似的问题已经被问了很多次,也得到了回答。 互联网上的许多文章只指向一个答案,即。
int
值或
2147483647
的最大值

内联是stackoverflow的两个链接:

然而,当我试图检查相同的异常时,抛出了一个
OutOfMemoryException
。事实上,我试着将大小减少2倍到
1073741823
(抛出异常),将大小减少4倍到
536870911
(抛出异常),将大小减少8倍到
268435455
(程序执行良好,没有任何异常)

测试代码:

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            int arraySize = Int32.MaxValue / 1; //Factor when set to 8, program executes without any exception
            int[] testArray = new int[arraySize];

            testArray[0] = 6;

            Console.WriteLine("Press Enter to finish.");
            Console.ReadLine();
        }
    }
}

看起来所有其他答案都指向理论值2147483647。然而,在实践中并非总是如此。所以问题是,如果应用程序代码非常简单,只需一个数组和几个控制台调用,那么是否有可能计算出应用程序将抛出OutOfMemoryException的数组大小。

NET framework默认情况下将任何对象的最大大小限制为2 GB。如果启用相应的设置,64位平台上的阵列可能会更大

因此,理论上,
int
数组的限制应该是536 870 912个元素左右,但这并不能说明数组本身的内存占用,因此实际限制必须更小


另一个问题是需要在内存空间中分配阵列。如果分配器找不到任何这样的空间,即使对象的大小低于最大大小限制,您也会得到一个
OutOfMemoryException

网络框架默认将任何对象的最大大小限制为2 GB。如果启用相应的设置,64位平台上的阵列可能会更大

因此,理论上,
int
数组的限制应该是536 870 912个元素左右,但这并不能说明数组本身的内存占用,因此实际限制必须更小


另一个问题是需要在内存空间中分配阵列。如果分配器找不到任何这样的空间,即使对象的大小低于最大限制,您也会得到一个
OutOfMemoryException

哪个.NET版本?什么咬?您是否有
gcAllowVeryLargeObjects
?关键是您的应用程序需要能够分配连续数量的arraySize*elementSize内存。如果不能,它就会失败。总之,使用托管代码来预测这是否会成功并不是件小事。你到底需要这么大的数组做什么?Int32.MaxValue=2147483647,它比数组的最大大小大。你链接的第一个问题给出了你需要的答案,你读过了吗?最后,我再强调也不过分了:拥有巨大的向量通常是个坏主意,会伤害你,所以问“理论上我能拥有的最大阵列是什么”通常是一个迹象,表明有人(隐喻性地)用猎枪指着他们的脚,问他们理论上能使用的最强大的炮弹是什么。有些场景是相关的,但它们是利基的,并且经常借用非托管内存(也许使用
内存
/
Span
)是一个更好的主意。如果您尝试使用536870850之类的数组大小,这可能会起作用(对于单个对象,它使您刚好低于2GB的限制)。但是,您不能保证它会工作,因为操作系统可能无法为您分配足够的连续内存。无法保证任何分配都会成功,但失败的可能性会随着分配的增加而增大。哪个.NET版本?多少位?您是否有
gcAllowVeryLargeObjects
?关键是您的应用程序阳离子需要能够分配连续数量的arraySize*elementSize内存。如果不能,它将失败。好吧,使用托管代码来预测这是否会成功并非易事。你到底需要这么大的数组做什么?Int32.MaxValue=2147483647,它大于数组的最大大小。你链接的第一个问题是gi如果你能找到你需要的答案,你读了所有的内容吗?最后,我再怎么强调也不为过:拥有巨大的向量通常是一个坏主意,而且会伤害你,所以问“理论上我能拥有的最大数组是什么”通常是一个迹象,表明某人是(隐喻性地)用猎枪指着他们的脚,问他们理论上可以使用的最强大的外壳是什么。有些场景与此相关,但它们是利基的,并且经常借用非托管内存(可能使用
内存
/
Span
)这是一个更好的主意。如果您尝试使用536870850之类的数组大小,这可能会起作用(对于单个对象,它使您刚好低于2GB的限制)。但是,您不能保证它会工作,因为操作系统可能无法为您分配足够的连续内存。无法保证任何分配都会成功,但失败的可能性会随着分配的增加而增加。感谢您@InBetween.“536 870 912“对我来说是有意义的。我错过了2GB必须被除4的数学。这对我来说是一个有价值的观点。谢谢你@中间人。“536 870 912”对我来说是有意义的。我错过了2GB必须被除4的数学。这对我来说是一个有价值的观点。