На моей 64-битной машине этот код С# работает:
new byte[2L * 1024 * 1024 * 1024 - 57]
но это выбрасывает OutOfMemoryException
:
new byte[2L * 1024 * 1024 * 1024 - 56]
Почему?
Я понимаю, что максимальный размер управляемого объекта составляет 2 ГБ, а объект массива, который я создаю, содержит больше, чем байты, которые я хочу. А именно, для номера синхронизации, есть 4 байта (или 8?), 8 байтов для ссылки MethodTable и 4 байта для размера массива. Это 24 байта, включая дополнение, поэтому почему я не могу выделить массив с 2G - 24 байтами? Максимальный размер действительно составляет 2 ГБ? Если это так, для чего используется остальная часть 2 ГБ?
Примечание. Мне не нужно выделять массив с 2 миллионами байтов. И даже если бы я это сделал, 56 байтов были незначительными накладными расходами. И я мог бы легко обойти это ограничение, используя пользовательский BigArray<T>
.