2008-11-27 9 views
5

Me gustaría saber la diferencia entre variables estáticas y variables globales en términos de velocidad de acceso y consumo de espacio. (Si quieres conocer mi plataforma: compilador gcc en Windows. (Estoy usando Cygwin con Triton IDE para programación ARM7 en Windows. Triton viene con compilador gcc en la plataforma Java que se puede ejecutar en Windows.))Estático vs global en términos de consumo de velocidad y espacio en C

(Obviamente, lo sé en términos de alcance de archivos y funciones desde this question)

Edición: OK dame una respuesta en cualquier microcontrolador/entorno de procesador.

Respuesta

10

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.

1

Consumo de espacio: básicamente no hay diferencia. La única vez que habrá un problema de espacio es si logras obtener la misma cantidad de datos estáticos ocultos en N archivos de objetos, entonces obtienes un factor de multiplicación de N donde podrías tener solo 1 copia si fuera una sola pieza global de datos. Sin embargo, ese es un problema de diseño erróneo. El ocultamiento de la información es bueno, a menos que la información no deba ocultarse.

Velocidad de acceso: ninguna diferencia.

1

Es difícil de adivinar o estimar. Probablemente llevaría tiempo, pero haría un proyecto de muestra y probaría la velocidad. Prueba de velocidad de acceso y espacio con un bucle. Pruebe el proyecto de ejemplo con un emulador para esa arquitectura.

+0

Observar el ensamblaje producido por el compilador sería revelador también. –

1

Esperaría que cualquier diferencia provendría de problemas de embalaje (por espacio) y almacenamiento en caché (por velocidad). Ambos también pueden surgir de cualquier otra cosa.

0

No hay diferencia no hay diferencia en el env que describe cuando se trata de espacio. Las var estáticas o globales consumen la misma cantidad de memoria.

Para velocidad consideraciones (pero no es buena práctica) que podrían preferir VARs globales, si necesita tener acceso a la var fuera del un archivo. (ref use external char my_global_char_placed_else_where;)

Para una mejor práctica, utilice las funciones get/set pero son más lentas. Entonces, podrías usar macros para obtener/establecer una var que sea global para ocultar al lector del código que la var es de hecho global, pero eso es como hacer trampa. Pero puede hacer que el código sea más legible.

Si compara ocultar una var dentro de una función, entonces no tiene ninguna diferencia en comparación con colocarla fuera de la función y más funciones podrían tener acceso a la var.

Yo mismo uso MSP430, ARM7 (sólo para pruebas) y micros AVR32 para el desarrollo

+0

Gracias Jonathan Leffler – eaanon01

0

Qué dice Jonathan no es exactamente correcto. Ambas variables estáticas y globales se guardarán (deben estar) en las regiones ZI (o RW). El compilador no puede "mantener" el registro estrictamente; lo que podría hacer es cargar el valor en el registro, usar ese registro para todas las operaciones y luego guardar ese valor de nuevo, eso es una optimización específica del compilador. Y aun así, no hay ninguna razón por la que el compilador no haga eso también para las variables globales: a menos, por supuesto, que sea volátil. Pero luego, técnicamente también puede hacer que una variable estática sea volátil, así que de nuevo no hay diferencia.

Edit: oh yeah - space: no hay diferencia.