Какой точный максимальный предел элементов в массиве

Это чисто теоретический вопрос, поэтому, пожалуйста, не предупреждайте меня об этом в своих ответах.

Если я не ошибаюсь, и так как каждый массив в.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 границ, "векторный" тип не имеет.

Другие вопросы по тегам