¿Por qué el tamaño máximo del byte [] 2 GB - 57 B?
En mi máquina de 64 bits, este código C # funciona:
new byte[2L * 1024 * 1024 * 1024 - 57]
pero este arroja unOutOfMemoryException
:
new byte[2L * 1024 * 1024 * 1024 - 56]
¿Por qué
Entiendo que el tamaño máximo de un objeto administrado es de 2 GB y que el objeto de matriz que estoy creando contiene más de los bytes que quiero. Es decir, hay 4 bytes (u 8?) Para el número de bloque de sincronización, 8 bytes para la referencia de la tabla de métodos y 4 bytes para el tamaño de la matriz. Eso es 24 bytes, incluido el relleno, así que ¿por qué no puedo asignar una matriz con 2G - 24 bytes? ¿El tamaño máximo es realmenteexactament 2 GB? Si ese es el caso, ¿para qué se usa el resto de 2 GB?
Nota: en realidad no necesito asignar una matriz con 2 millones de bytes. E incluso si lo hiciera, 56 bytes es una sobrecarga insignificante. Y podría superar el límite fácilmente usando customBigArray<T>
.