Какой точный максимальный предел элементов в массиве
Это чисто теоретический вопрос, поэтому, пожалуйста, не предупреждайте меня об этом в своих ответах.
Если я не ошибаюсь, и так как каждый массив в.NET индексируется Int32
это означает, что индекс варьируется от 0
в Int32.MaxValue
,
Предположим, что нет ограничений памяти /GC, массив в.NET может иметь до 2147483648
(и не 2147483647
) элементы. Правильно?
1 ответ
Ну, в теории это правда. На самом деле теоретически может быть поддержка больших массивов - посмотрите это Array.CreateInstance
подпись, которая принимает long
значения для длин. Вы не сможете индексировать такой массив с помощью индексаторов C#, но вы можете использовать GetValue(long)
,
Однако на практике я не верю, что какая-либо реализация поддерживает такие огромные массивы. CLR имеет ограничение для каждого объекта чуть более 2 ГБ, поэтому даже байтовый массив не может иметь 2147483648 элементов. Немного экспериментов показывает, что на моей коробке самый большой массив, который вы можете создать new byte[2147483591]
, (Это на 64-битной.NET CLR; версия Mono, на которой у меня установлены дроссели.)
РЕДАКТИРОВАТЬ: просто глядя на спецификации CLI, он указывает, что массивы имеют нижнюю границу и верхнюю границу Int32. Это будет означать верхние границы Int32.MaxValue
запрещены, даже если они могут быть выражены с Array.CreateInstance
звонки. Тем не менее, это также означает, что допустимо иметь массив с границами Int32.MinValue...Int.MaxValue
всего 4294967296 элементов.
РЕДАКТИРОВАТЬ: Снова глядя, ECMA 335 раздел III раздел 4.20 (newarr
) указывает, что инициализация типа вектора с newarr
должен взять либо native int
или же int32
значение. Таким образом, похоже, в то время как обычно более мягкий тип "массив" в терминологии CLI должен иметь int32
границ, "векторный" тип не имеет.