Pregunta

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

(Obviamente, sé en términos de alcance de archivos y funciones de esta pregunta )

Editar: OK, dame una respuesta en cualquier entorno de microcontrolador / procesador.

¿Fue útil?

Solución

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 de memoria a la variable es global y estático igual. Pero el compilador puede optimizar cuando tiene estática. Cuando compila un módulo, sabe que ninguna llamada a una función fuera del módulo puede cambiar una variable estática. Entonces sabe exactamente lo que sucede y puede, por ejemplo, manténgalo en un registro sobre llamadas de función. Cuando es global y llama a una función desde un módulo diferente, el compilador no puede saber lo que hace. Por lo tanto, debe suponer que la función accede a la variable y la cambia, lo que resulta en un almacenamiento y recarga.

Con gcc puede pasar todas las fuentes .c al mismo tiempo, para que también pueda ver lo que sucede en las llamadas a funciones de diferentes módulos. Para que funcione, debe pasar además de todos los archivos .c a la vez -combine y -fwhole-programme . El -fwhole-program hace que todas las globales sean estáticas (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 entre módulos.

Otros consejos

Consumo de espacio: básicamente no hay diferencia. El único momento en que habría un problema de espacio es si logras obtener la misma porción 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 incorrecto. La ocultación de información es buena, a menos que la información no se oculte.

Velocidad de acceso: no hay diferencia.

Es difícil adivinar o estimar. Probablemente tomarí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 muestra con un emulador para esa arquitectura.

Esperaría que cualquier diferencia provenga de problemas de empaque (por espacio) y almacenamiento en caché (por velocidad). Ambos también podrían surgir de casi cualquier otra cosa.

No hay ninguna diferencia en el entorno que usted describe cuando se trata de espacio . La var estática o global consume la misma cantidad de memoria.

Por consideraciones de velocidad ( pero no es una buena práctica ) podría preferir vars globales , si necesita acceso a la var fuera del archivo único . (uso de referencia de external char my_global_char_placed_else_where; )

Para una mejor práctica, utiliza funciones get / set en su lugar, pero son más lentas. Entonces, podría 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 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 (solo para pruebas) y micros AVR32 para desarrollo

Lo que Jonathan dice no es exactamente correcto. Ambas variables estáticas y globales se guardarán (deben ser) en las regiones ZI (o datos RW). El compilador no puede "mantener" sobre 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 nuevamente, eso es una optimización específica del compilador. E incluso entonces, no hay ninguna razón por la cual el compilador no haga eso también para las variables globales: a menos que, por supuesto, lo haga 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.

Editar: oh sí, espacio: no hay diferencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top