2014-01-28 2 views
7

Сегодня я начал задаваться вопросом о чем-то в MSDN. This article демонстрирует, как можно увеличить память, выделяемую массивом под .NET 4.5 и x64. Это приятная функция, но что-то в описании, предоставленном Microsoft, баффет меня.Максимальное количество элементов в массиве по сравнению с максимальным значением индексатора

В разделе «Примечание» они говорят, что:

Максимальный показатель в какой-либо одной размерности 2147483591 (0x7FFFFFC7) для байтовых массивов и массивов однобайтовых структур и 2,146,435,071 (0X7FEFFFFF) для другие типы.

Так как я в основном имею int[] или double[] последнее число имеет отношение к моей индексации. Я могу создать массив с int[] TestArray = new int[2146435071], что отлично. Однако в том же разделе говорится:

Максимальное количество элементов в массиве - UInt32.MaxValue.

Который (согласно MSDN):

Значение этой константы 4294967295; то есть шестнадцатеричный 0xFFFFFFFF.

Теперь. Если я получу это право, у меня может быть массив с до 4,294,967,295 элементов (например, ints), но из-за того, что массив индексируется int, а не uint, я не могу получить доступ к «верхней» половине моих данных?

Это меня смущает, кажется, что мне не хватает чего-то существенного здесь.

Я надеюсь, что вы можете просветить меня

С наилучшими пожеланиями

EDIT:

Я понимаю, что я могу создавать многомерные массивы, а массив длины 2E9 шириной 2 кажется немного глупым , Разве многомерные массивы не отображаются на одномерные?

+0

Я предполагаю, что «максимальное количество элементов» выше, потому что оно допускает многомерные массивы. 'new byte [4000000000]' не будет разрешено, но 'new byte [4000,1000000]' будет. – Douglas

ответ

4

Максимальный индекс в любом одном измерении является 2.147.483.591

Помните, что массивы могут иметь несколько размеров, так что вы могли иметь массив 2-D, который имеет до 4,294,967,295 элементов, но каждый размер может иметь максимальную длину 2 147 483 591.

Таким образом, у вас может быть массив 2 147 483 591 X 2, но не массив 1 000 000 х 1 000 000.

+0

Но я всегда думал, что многомерные массивы отображаются на одномерные? – lhiapgpeonk

+0

@lhiapgpeonk Нет - это не так. –

+2

@lhiapgpeonk Они хранятся в одном последовательном блоке памяти. Это не совсем то же самое. – Servy