Я слышал от кого-то, что максимальный размер массива в .NET составляет 4 ГБ? Просто интересно, правда ли это. Вы бы не мечтали сделать это на 32-битной .NET, но в 64-разрядной системе с 12 ГБ ОЗУ, может быть, возможно, вам захочется это сделать.: -)
Какова максимальная длина массива в .NET на 64-битной Windows
Ответ 1
У массива теоретически может быть не более 2,147,483,647 элементов, так как он использует int для индексирования. Фактический предел немного ниже этого, в зависимости от типа, содержащегося в массиве.
Однако в .NET CLR существует ограничение на ограничение одного объекта на 2 ГБ, даже на 64-битной. Это было сделано по дизайну.
Вы можете легко реализовать реализацию IList<T>
, которая внутренне хранит несколько массивов и позволяет вам выйти за пределы ограничения одного объекта на 2 ГБ, но в самой структуре не существует.
Как правило, это не проблема. В большинстве случаев у вас будут массивы, указывающие на большие классы, поэтому массив просто держит ссылки. Это означает, что ваш массив может эффективно указывать на многие, многие ГБ памяти, но сам массив не может быть > 2 ГБ.
Обратите внимание, что с .NET 4.5 существует новая опция, доступная для 64-битных приложений: gcAllowVeryLargeObjects. С помощью этого нового набора опций можно получить элементы UInt32.MaxValue
(4 294 967 295) в многомерном массиве, хотя одномерный массив по-прежнему ограничен 2 146 425 071 элементами (2 147 483 591 для однобайтовых массивов или массивов структуры, не содержащей ничего байт).
Новые правила с этой опцией:
- Максимальное количество элементов в массиве - UInt32.MaxValue.
- Максимальный индекс в любом одном измерении составляет 2 147 483 591 (0x7FFFFFC7) для массивов байтов и массивов однобайтовых структур и 2 146 425 071 (0X7FEFFFFF) для других типов.
- Максимальный размер для строк и других объектов без массива не изменяется.
Ответ 2
В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ. Начиная с 4.5 и выше вы можете выделить более крупные объекты, если gcAllowVeryLargeObjects включен. Обратите внимание, что ограничение для string
не влияет, но "массивы" также должны охватывать "списки", поскольку списки поддерживаются массивами.
Ответ 3
Максимальный размер любого объекта в .NET равен 2 ГБ.
Это, конечно же, затрудняет ограничение размера массива.
Вы можете создать "массив массивов" (и даже создать свой собственный индексатор для доступа к ним, как если бы это был один непрерывный массив), настолько большой, насколько вам нравится, если вы определите для него свой собственный класс.