¿Cuándo se asigna la memoria durante la comstackción?

Cuando yo escribo

int main() { int j; } 

La memoria para ‘j’ se asigna en el momento de la comstackción, pero ¿cuándo durante la comstackción? ¿Cuáles son las diversas etapas de la comstackción cuando la memoria se asigna a una variable? ¿Y si j era global?

Supongo que estás mezclando las cosas.

El comstackdor no asigna memoria para variables, genera código que asigna memoria para variables en tiempo de ejecución. Para globales se agregará al código de inicio del progtwig.

En C, main se comstack igual que cualquier otra función: cualquier variable declarada en main se “asignará” en la stack. Un marco de stack es la parte de la stack que se utiliza en una llamada de función única. El marco contiene ranuras para todos los locales utilizados dentro de una función. Esta memoria se considera temporal, ya que cuando la función regrese, este marco se quitará de la stack.

El comstackdor de C asignará una dirección estática a las variables globales. Esta dirección se considera parte de la “imagen” del binario y, como tal, tiene una ubicación estática en la memoria. El comstackdor de C conoce el tamaño de cada tipo, por lo que puede reservar la cantidad adecuada de espacio en el diseño de memoria del binario para cada variable global. Entonces, cualquier código que acceda a esta variable simplemente hará referencia a esta dirección.

Puedes examinar la dirección de una variable con un código como este:

 #include int i; void foo(int n) { if(n > 2) return; printf("From foo &n = %xd\n", &n); printf("From foo &i = %xd\n", &i); foo(n+1); } int main() { printf("&i = %xd\n", &i); foo(0); return 0; } 

Ejecutar este código produce una salida similar a:

 ./a.out &i = 600934d From foo &n = 38bc4efcd From foo &i = 600934d From foo &n = 38bc4eccd From foo &i = 600934d From foo &n = 38bc4e9cd From foo &i = 600934d 

Hay dos cosas que debes notar aquí:

  1. La dirección de i es constante cada vez que se hace referencia
  2. La dirección de n (una variable local de la función foo cambia con cada llamada a foo. De hecho, disminuirá cada vez, ya que la stack crece hacia abajo.

No en el momento de la comstackción, su ‘int j’ se asignará al inicio de la aplicación, cuando la aplicación entre en el ámbito principal () (en realidad no se asignará técnicamente, ya que se está utilizando la stack), los globales se asignarán en tiempo de ejecución antes de entrar en el ámbito principal ().

La comstackción genera el código ejecutable de un progtwig. La memoria del progtwig se asigna cuando se ejecuta ese código ejecutable.

El proceso de comstackción no asigna la memoria. Genera el código que asigna la memoria 🙂

En este caso, j sería una llamada variable de stack y se asignaría cuando la ejecución entre en la función main (). Las variables globales y estáticas se asignan en el montón en su lugar.

Aquí hay una breve explicación: http://www.costech.or.tz/cs231/websites/C%20Programming/www-ee.eng.hawaii.edu/Courses/ee150/Book/chap14/subsection2.1.1.8.html . Veré si puedo encontrar una mejor.

Depende del comstackdor dónde colocar j. Por lo general, las variables locales se colocan en la stack y, como tal, para su ejemplo particular, el comstackdor probablemente reservará el espacio en la stack durante la duración de la función principal. Tenga en cuenta que esto es diferente de la memoria variable global, que puede recibir su propia memoria.

La memoria no se asigna en el momento de la comstackción, sino en el tiempo de ejecución. El comstackdor acaba de generar el código de máquina que ejecutará su progtwig, las asignaciones reales suceden en tiempo de ejecución. En este caso, la variable no se usa y no se emitirá ningún código para ella.

Creo que estás mirando las etapas de comstackción, en lugar de la asignación de memoria de ‘j’. Como creo que sí, aquí está lo que pasa:

Una vez que alimenta su código fuente al comstackdor de C, la (s) primera (s) etapa (s) es (son) análisis léxico y semántico en el que se analizan la syntax y la semántica del código fuente para determinar su corrección. Si se encontró un error (s), el comstackdor informa en consecuencia y no sigue adelante. Si no se encontraron errores, se procede a la generación de una representación intermedia del código fuente, generalmente después de varias optimizaciones. Esta representación intermedia puede estar en un idioma nativo (nativo del sistema operativo / architecture, como en C) o en un bytecode independiente de la plataforma (como Python / Java ..). La función del comstackdor termina aquí.

La asignación de memoria ocurre solo cuando ejecutas el código. Este es el tiempo de ejecución del progtwig. Esto viene solo después de la etapa de comstackción, que probablemente no querría saber aquí. Si quieres, por favor házmelo saber. Intentaré agregar lo que sé.

HTH.