[ Foro de C ]
Variables locales v/s globales
Holap:
Tengo una pregunta.
Son más rápidas de ACCEDER las variables locales que las globales? o la velocidad de acceso es la misma (o la diferencia es despreciable)? (en otras palabras: un programa es más rápido usando variables locales en lugar de globales?)
Si la respuesta es no, entonces: Por qué no hacer programas con TODAS las
variables globales y con funciones sin argumentos (pues sería innecesario)?
Una posible respuesta a esto último es: "porque las variables locales le dan mas ORDEN al programa...", pero yo, personalmente, me siemto más cómodo trabajando con variables globales y funciones sin argumentos que con variables locales (a menos, claro, que la variable local sea la típica variable int i=0; usada para un loop).
La pregunta es MUY interesante, en mi opinión:
Las variables locales son ligeramente más lentas que las locales: cada vez que se entra a la función, se debe reservar espacio para la variable, y cuando termina la función se debe liberar ese espacio reservado.
Por tanto, un programa que sólo tuviera variables globales sería ligeramente (despreciable) más rápido que uno "modular". Pero si se trata de millones de llamadas a funciones y hay que optimizar al máximo, suele ser preferible "eliminar" la función, e incluir las órdenes que la formaban dentro de la función que la llamaba. Y no es sólo por las variables locales, sino por toda la carga adicional que supone cada llamada a una función (guardar registros de la CPU y dirección de memoria actual en la pila, restaurar todos ellos después de terminar la función, etc).
Siendo purista, sería innecesario (o casi ;-) ) usar variables locales. Se puede hacer un programa en C usando sólo variables globales. Pero las locales se usan, y es básicamente por mantenibilidad:
- Si la declaración de la función (con su comentario explicativo) está cerca de donde se usa, el programa es más legible.
- Si se repite un nombre de variable en varias partes de un programa, sea porque "parezca trivial", como el caso de la "i" que controla un "for", o sea por error... un cambio en una variable podría tener efectos laterales no deseados en otras partes del programa, y además este tipo de errores son muy difíciles de detectar.
De hecho, en programación orientada a objetos (que es la tendencia actual) no tiene sentido hablar de variables globales a todo el programa, sino como mucho a una clase. Ten en cuenta que se tiende a que los programas sean más fáciles de crear y depurar. Si son ligeramente más lentos, es algo perfectamente asumible con equipos tan rápidos como los actuales. Pero hay que evitar que pequeñísimas ganancias de velocidad hagan los programas menos fiables.
Es más, en programación orientada a objetos se recomienda no acceder directamente a las variables de una clase, sino usar métodos como "setX" para cambiar el valor de "x", y "getX" para leer su valor. Esto permite que se puedan hacer cambios a la estructura interna de un programa (incluso cambiando el tipo de datos que corresponde internamente a una variable), pero su manejo seguiría siendo el mismo.
Espero haberte aclarado algo...
Wenas,
pues yo, la verdad, veo bastante más útil usar variables locales por varias razones:
1- se ve más claro el codigo y es más facil saber para que se usa cada una en el caso de ver un codigo de otra persona que no ha puesto comentarios.
2.- si es un programa que se hace entre varias personas cada uno tiene sus funciones con sus variables y si hace falta ya recibe o devuelve valores y hay menos lios.
3.- se pueden usar contadores tipicos como i o j en vez de tener que tener 20 contadores con nombres diferentes.
Esta claro que las globales tienen tambien sus ventajas, cómo que no hay que pasar valores o devolverlos en las funciones y puede ser más cómodo.
En conclusión, si es un programa corto puede ser más comodo usar globales, pero para uno ya más complejo mejor locales y cuantas menos globales mejor. Pero ya es cosa de gustos.
Muchas gracias por las respuestas, ahora tengo todo mucho más claro... ;-)
Estoy 100% de acuerdo contigo, Taisen Tetsu.
Saludos.
Carlos.
Taisen ha dicho otro de los factores importantes: el tamaño del programa.
Uno de los últimos proyectos en que estoy participando ocupa ahora mismo 4.900 líneas, repartidas en 29 ficheros, realizados por 5 personas. Eso no se puede considerar un proyecto grande. Probablemente, ni siquiera sea todavía un proyecto "mediano", pero aun así imagínate si todo eso hubiera que coordinarlo con variables globales... imposible de mantener sin problemas.
De hecho, en este proyecto no hay ni una variable global. Todo son clases (orientado a objetos) que se comunican entre sí.
(No se puede continuar esta discusión
porque tiene más de dos meses de antigüedad.
Si tienes dudas parecidas, abre un nuevo hilo.)