Saltar al contenido

¿Cómo anular la declaración (eliminar) variable en C?

Este team de trabajo ha pasado mucho tiempo investigando para dar solución a tus dudas, te dejamos la respuestas así que deseamos resultarte de gran ayuda.

Solución:

No, pero puede crear ámbitos mínimos pequeños para lograr esto, ya que todas las variables locales del ámbito se destruyen cuando se sale del ámbito. Algo como esto:

void foo() 
    // some codes
    // ...
        // create an extra minimum scope where a is needed
        int a;
    
    // a doesn't exist here

No es una respuesta directa a la pregunta, pero podría aportar algo de orden y comprensión sobre por qué esta pregunta no tiene una respuesta adecuada y por qué es imposible “eliminar” variables en C.

Punto #1 ¿Qué son las variables?

Las variables son una forma para que un programador asigne un nombre a un espacio de memoria. ¡Esto es importante, porque significa que una variable no tiene que ocupar ningún espacio real! Siempre que el compilador tenga una forma de realizar un seguimiento de la memoria en cuestión, una variable definida podría traducirse de muchas maneras para no ocupar ningún espacio. Considerar: const int i = 10; Un compilador podría elegir fácilmente sustituir todas las instancias de i en un valor inmediato. i ocuparía 0 memoria de datos en este caso (dependiendo de la arquitectura podría aumentar el tamaño del código). Alternativamente, el compilador podría almacenar el valor en un registro y, de nuevo, no se utilizará espacio de pila ni de almacenamiento dinámico. No tiene sentido “desdefinir” una etiqueta que existe principalmente en el código y no necesariamente en el tiempo de ejecución.

Punto #2 ¿Dónde se almacenan las variables?

Después del punto #1, ya comprende que esta no es una pregunta fácil de responder, ya que el compilador puede hacer lo que quiera sin romper su lógica, pero en general, las variables se almacenan en la pila. Cómo funciona la pila es bastante importante para su pregunta. Cuando se llama a una función, la máquina toma la ubicación actual del puntero de instrucción de la CPU y el puntero de pila actual y los empuja a la pila, reemplazando el puntero de pila a la siguiente ubicación en la pila. Luego salta al código de la función que se está llamando.

Esa función sabe cuántas variables tiene y cuánto espacio necesitan, por lo que mueve el puntero del marco para capturar un marco que podría ocupar todas las variables de la función y luego simplemente usa stack. Para simplificar las cosas, la función captura suficiente espacio para todas sus variables desde el principio y cada variable tiene un desplazamiento bien definido desde el principio del marco de pila de la función*. Las variables también se almacenan una tras otra. Si bien puede manipular el puntero del marco después de esta acción, será demasiado costoso y en su mayoría inútil: el código en ejecución solo usa el último marco de la pila y podría ocupar toda la pila restante si es necesario (la pila se asigna al inicio del hilo), así que “liberar” variables da poco beneficio. La liberación de una variable desde la mitad del marco de la pila requeriría una operación de desfragmentación que sería muy costosa para la CPU y no tendría sentido recuperar algunos bytes de memoria.

Punto #3: Deje que el compilador haga su trabajo

El último problema aquí es el simple hecho de que un compilador podría optimizar su programa mucho mejor que usted. Dada la necesidad, el compilador podría detectar ámbitos variables y memoria superpuesta a la que no se puede acceder simultáneamente para reducir el consumo de memoria de los programas (marca de compilación -O3). No es necesario que “libere” las variables, ya que el compilador podría hacerlo sin su conocimiento de todos modos.

Esto es para complementar todo lo dicho antes que yo acerca de que las variables son demasiado pequeñas para importar y el hecho de que no hay un mecanismo para lograr lo que pediste.


* Los lenguajes que admiten matrices de tamaño dinámico podrían alterar el marco de la pila para asignar espacio para eso array sólo después del tamaño de la array fue calculado.

No hay forma de hacer eso en C ni en la gran mayoría de los lenguajes de programación, ciertamente en todos los lenguajes de programación que conozco.

Y no ahorrarías “mucha memoria”. La cantidad de memoria que ahorraría si hiciera tal cosa sería minúscula. Diminuto. No vale la pena hablar.

El mecanismo que facilitaría la depuración de variables de esa manera probablemente ocuparía más memoria que las variables que depuraría.

La invocación del código que recuperaría el código de las variables individuales también ocuparía más espacio que las propias variables.

Así que si hubiera un método mágico purge() que depura variables, no sólo la implementación de purge() sería más grande que cualquier cantidad de memoria que esperaría recuperar al purgar variables en su programa, pero también, en int a; purge(a); la llamada a purge() ocuparía más espacio que a sí mismo.

Eso es porque las variables de las que estás hablando son muy pequeñas. los printf("%d", a); El ejemplo que proporcionó muestra que está pensando en recuperar de alguna manera la memoria ocupada por individuos int variables Incluso si hubiera una forma de hacerlo, estaría ahorrando algo del orden de 4 bytes. La cantidad total de memoria ocupada por tales variables es extremadamente pequeña, porque es una función directa de cuántas variables usted, como programador, declara escribiendo manualmente sus declaraciones. Se necesitarían años de escribir en un teclado sin hacer nada más que declarar variables sin pensar antes de declarar una cantidad de int variables que ocupan una cantidad de memoria de la que vale la pena hablar.

Finalizando este artículo puedes encontrar las observaciones de otros sys admins, tú igualmente puedes insertar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *