Какова максимальная длина массива в.NET в 64-разрядном Windows

Я получил известие от кого-то, что максимальный размер массива в.NET составляет 4 ГБ? Просто удивление, если это верно. Вы не мечтали бы о выполнении этого на 32-разрядной.NET, но в 64-разрядной системе с 12 ГБ RAM, возможно, просто возможно, Вы могли бы хотеть сделать это.:-)

23
задан Keith Hill 26 February 2010 в 00:47
поделиться

2 ответа

Теоретически массив может содержать не более 2 147 483 647 элементов, поскольку для индексации он использует int. Фактический предел немного ниже, в зависимости от типа, содержащегося в массиве.

Однако в .NET CLR существует ограничение на один объект не более 2 ГБ, даже в 64-битной среде. Это было сделано намеренно .

Вы можете легко создать реализацию IList , которая внутри хранит несколько массивов и позволяет вам расширяться за пределы ограничения одного объекта в 2 ГБ, но в самой структуре такого нет.

Однако, как правило, это не проблема. В большинстве случаев у вас будут массивы, указывающие на большие классы, поэтому массив просто содержит ссылки. Это означало бы, что ваш массив может эффективно указывать на многие, многие ГБ памяти, но сам массив не может быть> 2 ГБ.


Обратите внимание, что, начиная с .NET 4.5, доступна новая опция, позволяющая использовать 64-битные приложения: gcAllowVeryLargeObjects . С помощью этого нового набора параметров можно получить элементы UInt32.MaxValue (4 294 967 295) в многомерном массиве, хотя одномерный массив по-прежнему ограничен 2 146 435 071 элементом (2 147 483 591 для однобайтовых массивов или массивов структуры, не содержащей ничего кроме байта).

Новые правила с этой опцией:

  • Максимальное количество элементов в массиве - UInt32.MaxValue.
  • Максимальный индекс в любом одном измерении составляет 2 147 483 591 (0x7FFFFFC7) для байтовых массивов и массивов однобайтовых структур и 2 146 435 071 (0X7FEFFFFF) для других типов.
  • Максимальный размер строк и других объектов, не являющихся массивами, не изменился.
40
ответ дан 29 November 2019 в 01:45
поделиться

Пометьте UIAlertView следующим образом:

#define kAlertViewOne 1
#define kAlertViewTwo 2

UIAlertView *alertView1 = [[UIAlertView alloc] init...
alertView1.tag = kAlertViewOne;

UIAlertView *alertView2 = [[UIAlertView alloc] init...
alertView2.tag = kAlertViewTwo;

, а затем разделите их в методах делегата с помощью следующих тэгов:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(alertView.tag == kAlertViewOne) {
        // ...
    } else if(alertView.tag == kAlertViewTwo) {
        // ...
    }
}
-121--1218905-

Можно щелкнуть правой кнопкой мыши на URL-адресе в терминале, и первый параметр в контекстном меню - «Открыть URL-адрес». Не идеально, но, возможно, достаточно хорошо?

-121--691366-

Максимальный размер любого объекта в .NET равен 2GB.

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

Вы можете создать «массив массивов» (и даже создать свой собственный индексатор для доступа к ним, как если бы это был один смежный массив) настолько большой, насколько вам угодно, если вы определяете для него свой собственный класс.

0
ответ дан 29 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: