2009-05-05 3 views
3

Не то, чтобы мне когда-либо понадобилось это делать, но я хочу понять, как он работает/не работает. Я много искал для максимальной длины массива и ничего не могу найти.Максимальный размер .NET-массивов

long[] hugeArray = new long[long.MaxValue]; 

//No exceptions 
Console.WriteLine("Init"); 

//Overflow exception 
Console.WriteLine(hugeArray.LongLength.ToString()); 

hugeArray = new long[int.MaxValue]; 

//OutOfMemoryException 
Console.WriteLine(hugeArray.Length.ToString()); 

И я предполагаю, что прослеживание вопрос будет, если есть предел, и я инициализация вне этого предела, то почему не исключения, когда не создавая только при использовании? И нужно ли это компилятору?

+0

Возможный дубликат [Какова максимальная длина массива в .NET на 64-разрядной Windows] (http://stackoverflow.com/questions/2338778/what-is-the-maximum-length-of-an -array-в-нетто-на-64-разрядные окна) – skolima

ответ

3

Согласно SpankyJ, .NET 2.0, по крайней мере, имел ограничение по 2 ГБ на массив. 8 байтов (sizeof long) * ~ 2^31 = 16 гигабайт (не говоря уже о необходимой памяти). Что касается переполнения, я согласен с marcc, вероятно, потому, что ожидается, что массивы будут проиндексированы (см., Например, this method Хотя я немного не уверен в этом, так как this overload принимает массив длиной Int64. Это может быть только расширение доступны в более поздних версиях.

в целом, однако, это в основном теоретический вопрос. Любой на самом деле, опираясь на это, вероятно, делать что-то не так.

0

Индекс массива - это int, не долго. Итак, я думаю, что технически новый long [int.MaxValue] будет максимальным. Но вы все равно можете получить OutOfMemoryException, которое вы видите, если у вас действительно закончилась нехватка памяти. Вы запускаете это на 32-битной ОС? Существует не установленная максимальная длина, кроме значения индекса - int, а не длинная.

5

основополагающие опкоды IL для массивов сделки с IntPtr (известный как родной междунар в документации ИЛ):

  • newarr создает массив, и принимает IntPtr
  • ldelem и stelem чтения и записи элементов, и они используют IntPtr индекс
  • ldlen возвращает длину массива и возвращает беззнаковое IntPtr

Я ожидаю теоретическое ограничение на количество элементов 2^31-1 на 32-битных платформах и 2^63-1 на 64-битных платформах.

Однако, я просто попробовал этот код на своем 64-битном ПК, и я получил OutOfMemoryException по первому размещению, так что практические ограничения меньше.

Смежные вопросы