c# - ¿Por qué ''Cualquier CPU(prefiere 32 bits)'' me permite asignar más memoria que x86 en.NET 4.5?
visual-studio-2015 out-of-memory (1)
Según muchas respuestas de SO y esta publicación de blog ampliamente citada , una aplicación .NET 4.5 creada para ''Cualquier CPU'' con la opción ''preferir 32 bits'' seleccionada se ejecutará como un proceso de 32 bits tanto en 32 bits como en 64 bits sistemas (a diferencia de .NET 4.0 y anteriores). En otras palabras, x86 y AnyCPU con ''preferir 32 bits'' seleccionados son equivalentes (ignorando si puede ejecutarse o no en ARM).
Sin embargo, mis pruebas han demostrado que en un sistema de 64 bits, una aplicación ''AnyCPU preferred 32-bit'' (que confirmo que se ejecuta en 32 bits) puede asignar más memoria que una x86. Escribí una aplicación de consola .NET 4.5 C # que asigna matrices de 10MB de bytes en un bucle (manteniendo las referencias por supuesto) hasta que golpea una OutOfMemoryException, y la ejecutó en un sistema de 64 bits con mucha RAM. Cuando se construye como x86, se cae a aproximadamente 1,2 GB asignados. El mismo código construido como ''Cualquier CPU (prefiera 32 bits)'' obtiene hasta 1.5GB.
¿Por qué la diferencia?
Resulta que, en Visual Studio 2015, construir como ''AnyCPU (preferir 32 bits)'' establece el bit IMAGE_FILE_LARGE_ADDRESS_AWARE en el ejecutable (equivalente a ejecutar editbin /LARGEADDRESSAWARE
en él), mientras que no lo hace para una construcción x86. Esto se puede confirmar con dumpbin /HEADERS
y buscando la línea "La aplicación puede manejar direcciones grandes (> 2GB)".
Este no es el caso de Visual Studio 2013. El cambio aparentemente no está documentado .
En teoría, esto debería darle al CLR 2 GB adicionales para jugar. No sé por qué la memoria asignable solo sube unos 300 MB.