這是一個純粹的理論問題,請不要在您的答案中提醒我。數組中元素的確切上限是多少
如果我沒有弄錯,並且.NET中的每個數組都被索引爲Int32
,這意味着索引範圍從0
到Int32.MaxValue
。
假設無記憶/ GC約束涉及在.NET的陣列可以具有多達2147483648
(而不是2147483647
)元素。對?
這是一個純粹的理論問題,請不要在您的答案中提醒我。數組中元素的確切上限是多少
如果我沒有弄錯,並且.NET中的每個數組都被索引爲Int32
,這意味着索引範圍從0
到Int32.MaxValue
。
假設無記憶/ GC約束涉及在.NET的陣列可以具有多達2147483648
(而不是2147483647
)元素。對?
那麼,在理論這是真的。實際上,理論上可以支持更大的陣列 - 請參閱Array.CreateInstance
簽名,其長度值爲long
。您將無法使用C#索引器索引這樣的數組,但您可以使用GetValue(long)
。
但是,在實際條款,我不相信任何實現支持如此巨大的數組。 CLR的每個對象的限制少於2GB,所以即使是一個字節數組實際上也有2147483648個元素。一些實驗表明,在我的盒子上,您可以創建的最大陣列是new byte[2147483591]
。 (這是在64位.NET CLR;我已經安裝了扼流圈的單聲道版本)。
編輯:只看CLI規範,它指定數組有一個下限和上限的INT32。這意味着即使可以用Array.CreateInstance
調用來表示Int32.MaxValue
的上限也是禁止的。然而,它也也意味着它是允許有一個數組的界限Int32.MinValue...Int.MaxValue
,即總計4294967296元素。
編輯:再次尋找,ECMA 335分區III節4.20(newarr
)指定一個初始化矢量類型與newarr
必須採取任一個或native int
值int32
。因此,看起來像CLI術語中通常較寬鬆的「陣列」類型必須具有int32
範圍,而「矢量」類型不具有範圍。
相似/ Dupey問題:http://stackoverflow.com/questions/1391672/what-is-the-maximum-size-that-an-array-can-hold – gideon 2011-03-20 07:53:36
如果你發現你需要一個數組超過2147483647項目,你應該尋找另一種算法... – 2011-03-20 07:54:26