在C#2008中,数组可容纳的最大大小是多少?
答案 0 :(得分:48)
System.Int32.MaxValue
假设你的意思是System.Array
,即。任何正常定义的数组(int[]
等)。这是数组可以容纳的最大值。每个值的大小仅受可用于保存它们的内存量或虚拟内存量的限制。
强制执行此限制是因为System.Array
使用Int32
作为索引器,因此只能使用Int32
的有效值。除此之外,只能使用正值(即>= 0
)。这意味着数组大小的绝对最大上限是Int32
值的绝对最大上限,Int32.MaxValue
中可用,相当于2 ^ 31,或大约20亿
在一个完全不同的说明中,如果您担心这一点,很可能您正在使用很多数据,无论是正确还是错误。在这种情况下,我会考虑使用List<T>
而不是数组,这样您只需要使用尽可能多的内存。事实上,我建议始终使用List<T>
或其他通用集合类型。这意味着只会分配实际使用的内存,但您可以像使用普通数组一样使用它。
另一个音符集合是Dictionary<int, T>
,您可以像普通数组一样使用它,但只会稀疏地填充。例如,在以下代码中,将只创建一个元素,而不是数组将创建的1000个元素:
Dictionary<int, string> foo = new Dictionary<int, string>();
foo[1000] = "Hello world!";
Console.WriteLine(foo[1000]);
使用Dictionary
还可以控制索引器的类型,并允许您使用负值。对于绝对最大尺寸的稀疏数组,您可以使用Dictionary<ulong, T>
,这将提供比您想象的更多潜在元素。
答案 1 :(得分:17)
每个MSDN
默认情况下,阵列的最大大小为 2千兆字节(GB)。
在64位环境中,您可以通过在运行时环境中将gcAllowVeryLargeObjects配置元素的enabled属性设置为true来避免大小限制。
但是,阵列仍将限制为总共 40亿个元素。
请参阅此处http://msdn.microsoft.com/en-us/library/System.Array(v=vs.110).aspx
注意:这里我假设我们有足够的硬件RAM,专注于数组的实际长度。
答案 2 :(得分:12)
这个答案是关于.NET 4.5
According to MSDN,字节数组的索引不能大于2147483591.对于4.5之前的.NET,它也是数组的内存限制。在.NET 4.5中,此最大值相同,但对于其他类型,最大值可达2146435071。
这是插图的代码:
static void Main(string[] args)
{
// -----------------------------------------------
// Pre .NET 4.5 or gcAllowVeryLargeObjects unset
const int twoGig = 2147483591; // magic number from .NET
var type = typeof(int); // type to use
var size = Marshal.SizeOf(type); // type size
var num = twoGig / size; // max element count
var arr20 = Array.CreateInstance(type, num);
var arr21 = new byte[num];
// -----------------------------------------------
// .NET 4.5 with x64 and gcAllowVeryLargeObjects set
var arr451 = new byte[2147483591];
var arr452 = Array.CreateInstance(typeof(int), 2146435071);
var arr453 = new byte[2146435071]; // another magic number
return;
}
答案 3 :(得分:4)
以下是您详细解答的问题的答案: http://www.velocityreviews.com/forums/t372598-maximum-size-of-byte-array.html
您可能想要提及您正在使用的.NET版本以及您的内存大小。
对于你的应用程序,你会遇到2G,但是这取决于数组中的内容。
答案 4 :(得分:0)
我认为它与您的RAM(或可能是虚拟内存)空间相关联,并且绝对最大值受限于您的操作系统版本(例如32位或64位)
答案 5 :(得分:0)
因为Length是int我会说Int.MaxValue
答案 6 :(得分:0)
我认为如果您不考虑VM,则为Integer.MaxValue