2011-03-20 5 views
0

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

Если я не ошибаюсь, и так как каждый массив в .NET индексируется Int32, то есть диапазон индексов от 0 до Int32.MaxValue.

не Предположив нет памяти/GC ограничений вовлечены массива в .NET может иметь до 2147483648 (а не 2147483647) элементов. Правильно?

+0

Аналогичный вопрос/вопрос Dupey: http://stackoverflow.com/questions/1391672/what-is-the-maximum-size-that-an-array-can-hold – gideon

+0

, если вы обнаружите, что вам нужен массив с более чем 2147483647 элементов, вам, вероятно, следует искать еще один алгоритм ... –

ответ

8

Ну, в теория это правда. Фактически, в теории может быть поддержка больших массивов - см. Эту подпись Array.CreateInstance, которая принимает значения long для длин. Вы не смогли бы индексировать такой массив с помощью индексаторов C#, но вы могли бы использовать GetValue(long).

Однако, в практических условиях, я не верю, что любая реализация поддерживает такие огромные массивы. CLR имеет ограничение на объект, немного меньше 2 ГБ, поэтому даже байтовый массив не может фактически имеет 2147483648 элементов. Немного экспериментов показывает, что на моей коробке наибольший массив, который вы можете создать, - new byte[2147483591]. (Это на 64-битной .NET CLR, в версии Mono у меня установлены дроссели.)

EDIT: просто глядя на спецификацию CLI, он указывает, что массивы имеют нижнюю границу и верхнюю границу Int32. Это означает, что верхние границы над Int32.MaxValue запрещены, хотя они могут быть выражены с помощью вызовов Array.CreateInstance. Тем не менее, это также означает, что допустимо иметь массив с границами Int32.MinValue...Int.MaxValue, то есть 4294967296 элементов в общей сложности.

EDIT: Глядя снова, ECMA 335 раздела III раздела 4,20 (newarr) указывает, что инициализация вектор типа с newarr должен принимать либо значение native int или int32. Таким образом, это выглядит так, как обычно, более мягкий тип «массива» в терминологии CLI должен иметь границы int32, «векторный» тип этого не делает.

+0

Большое спасибо! Конечно, на практике это невозможно, но когда правильность кода является обязательной, приходится иметь дело с такими вещами. – Miguel

+0

@Miguel: что имеет «правильность кода», связанный с вашим вопросом? –

+0

Мне нужно, чтобы теоретические ограничения для такого рода вещей никогда не превышались ни при каких обстоятельствах. – Miguel

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