2011-03-20 51 views
0

這是一個純粹的理論問題,請不要在您的答案中提醒我。數組中元素的確切上限是多少

如果我沒有弄錯,並且.NET中的每個數組都被索引爲Int32,這意味着索引範圍從0Int32.MaxValue

假設無記憶/ GC約束涉及在.NET的陣列可以具有多達2147483648(而不是2147483647)元素。對?

+0

相似/ Dupey問題:http://stackoverflow.com/questions/1391672/what-is-the-maximum-size-that-an-array-can-hold – gideon 2011-03-20 07:53:36

+0

如果你發現你需要一個數組超過2147483647項目,你應該尋找另一種算法... – 2011-03-20 07:54:26

回答

8

那麼,在理論這是真的。實際上,理論上可以支持更大的陣列 - 請參閱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 intint32。因此,看起來像CLI術語中通常較寬鬆的「陣列」類型必須具有int32範圍,而「矢量」類型不具有範圍。

+0

非常感謝你喬恩!當然實際上這是不可能的,但是當代碼正確性是強制性的時候,必須處理這種事情。 – Miguel 2011-03-20 07:54:19

+0

@Miguel:「代碼正確性」與您的問題有什麼關係? – 2011-03-20 07:55:17

+0

我需要確保這些類型的東西在任何環境下都不會超出理論極限。 – Miguel 2011-03-20 07:56:16

相關問題