No hay diferencia para el espacio, toman la misma cantidad.
Pero hay una diferencia de velocidad: la estática es más rápida.
Por supuesto, el acceso a la memoria a la variable es para lo mismo global y estático. Pero el compilador puede optimizar cuando tienes estática. Cuando compila un módulo, sabe que ninguna llamada de función a una función fuera del módulo puede cambiar una variable estática. Entonces, sabe exactamente lo que sucede y puede, por ejemplo, guárdelo en un registro sobre las llamadas a funciones. Cuando es global y llama a una función desde un módulo diferente, el compilador no puede saber qué hace. Por lo tanto, debe asumir que la función accede a la variable y la cambia, lo que resulta en una tienda y recarga.
Con gcc puede pasar todas las fuentes .c
al mismo tiempo, por lo que también puede ver lo que sucede en las llamadas a funciones de diferentes módulos. Para hacerlo funcionar, debe pasar además de todos los archivos .c
a la vez -combine
y -fwhole-program
. El -fwhole-program
hace que todos los globales estén estáticos (no el módulo estático sino la unidad de compilación estática, es decir, todos los archivos .c
dados juntos). El -combine
realiza el análisis intermodular.
Observar el ensamblaje producido por el compilador sería revelador también. –