Las variables globales que no tienen inicializadores explícitos, como el tuyo en este caso, se inicializan a 0 de manera predeterminada. Se colocan en un área de memoria llamada .bss segment, y no se almacenan datos adicionales en el archivo de objeto/archivo ejecutable que indica el valor inicial de los datos (a diferencia de los datos inicializados explícitamente, que tienen que tener su valor inicial almacenado en algún lugar).
Cuando el sistema operativo carga el programa, lee las descripciones de todos los segmentos y asigna memoria para eso. Como sabe que el segmento .bss se inicializa a todos los 0, puede hacer un truco furtivo para evitar tener que asignar realmente toneladas de memoria y luego inicializarlo a todos los 0: asigna espacio de direcciones para el segmento en la página del proceso tabla, pero todas las páginas apuntan a la misma página, llena de 0.
Esa única página cero también está configurada como de solo lectura. Luego, si y cuando el proceso escribe en algunos datos en el segmento .bss, se produce un error de página. El sistema operativo intercepta el error de página, se da cuenta de lo que está sucediendo y, a continuación, asigna memoria única para esa página de datos. A continuación, reinicia las instrucciones, y el código continúa de manera feliz, como si la memoria se hubiera asignado todo el tiempo.
Por lo tanto, el resultado final es que si tiene una matriz o variable global inicializada cero, cada fragmento de tamaño de página (normalmente 4 KB) que nunca se escribe nunca tendrá realmente memoria asignada para él.
Nota: Estoy siendo un poco confuso aquí con la palabra "asignado". Si profundizas en este tipo de cosas, es probable que encuentres palabras como "reservado" y "comprometido". Consulte this question y this page para obtener más información sobre esos términos en el contexto de Windows.
Dudo que esto sea relevante ya que es una matriz estática, pero ¿intentó 'memset'ting toda la matriz a cero? – Mysticial
En realidad esto es completamente relevante.Usando 'memset' el programa pasó de usar 92K a 381.6M. –
En ese caso, la respuesta de templatetypedef es correcta. – Mysticial