Зачем нужно Array LongLength?
От: Shmj Ниоткуда  
Дата: 24.07.21 11:45
Оценка:
Пытаюсь создать массив более 2 GB через Array.CreateInstance и получаю ошибку Arrays larger than 2GB are not supported.

Можно ли их как то создать? Думается свойство LongLength не просто так добавлено.


Немного пересмотрел вопрос. Если все равно нельзя создать массив более 0X7FEFFFFF — то зачем добавили свойство LongLength?
Отредактировано 24.07.2021 19:13 Shmj . Предыдущая версия . Еще …
Отредактировано 24.07.2021 15:58 Shmj . Предыдущая версия .
Re: [.Net 5] Array LongLength и массивы более 2GB...
От: bnk СССР http://unmanagedvisio.com/
Дата: 24.07.21 18:08
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Пытаюсь создать массив более 2 GB через Array.CreateInstance и получаю ошибку Arrays larger than 2GB are not supported.


S>Можно ли их как то создать? Думается свойство LongLength не просто так добавлено.


Вроде бы все нормально?

Array.CreateInstance(typeof(Int32), 0X7FEFFFFF); // ~8GB
Re[2]: [.Net 5] Array LongLength и массивы более 2GB...
От: Shmj Ниоткуда  
Дата: 24.07.21 18:40
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Вроде бы все нормально?


bnk>
bnk>Array.CreateInstance(typeof(Int32), 0X7FEFFFFF); // ~8GB
bnk>


Ок, почему byte тоже ограничен длиной 0X7FEFFFFF? Зачем тогда LongLength нужна?
Re[3]: [.Net 5] Array LongLength и массивы более 2GB...
От: bnk СССР http://unmanagedvisio.com/
Дата: 24.07.21 18:54
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ок, почему byte тоже ограничен длиной 0X7FEFFFFF? Зачем тогда LongLength нужна?


Я не в курсе, почему индекс в ограничен конкретно этой цифрой, думаю на собеседовании бы засыпался
Просто принимаю как есть, типа как то что предметы падают вниз.
Re: Зачем нужно Array LongLength?
От: Shmj Ниоткуда  
Дата: 24.07.21 19:27
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Немного пересмотрел вопрос. Если все равно нельзя создать массив более 0X7FEFFFFF — то зачем добавили свойство LongLength?


Вот, оказывается, зачем:

int[,] arr = new int[0X7F_EF_FF_FF, 2];
Console.WriteLine(arr.Length);
Re[2]: Зачем нужно Array LongLength?
От: bnk СССР http://unmanagedvisio.com/
Дата: 24.07.21 19:30
Оценка:
Здравствуйте, Shmj, Вы писали:

Это да, но тема сисек почему максимальный индекс 0x7FEF.FFFF = (0x7FFF.FFFF — 0x10.000) все еще осталась нераскрытой
Re[3]: Зачем нужно Array LongLength?
От: karbofos42 Россия  
Дата: 25.07.21 17:22
Оценка: +1
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, Shmj, Вы писали:


bnk>Это да, но тема сисек почему максимальный индекс 0x7FEF.FFFF = (0x7FFF.FFFF — 0x10.000) все еще осталась нераскрытой


https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element

The maximum size in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for arrays containing other types.


Видимо какая-то особенность реализации
https://referencesource.microsoft.com/#mscorlib/system/array.cs
// We impose limits on maximum array lenght in each dimension to allow efficient 
// implementation of advanced range check elimination in future.
// Keep in sync with vm\gcscan.cpp and HashHelpers.MaxPrimeArrayLength.
// The constants are defined in this method: inline SIZE_T MaxArrayLength(SIZE_T componentSize) from gcscan
// We have different max sizes for arrays with elements of size 1 for backwards compatibility
internal const int MaxArrayLength = 0X7FEFFFFF;
internal const int MaxByteArrayLength = 0x7FFFFFC7;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.