Semana 3 - Vicvargas/PortafolioDigital GitHub Wiki

Martes 06/08/19

Memory Management: Program level

Cuando un programa está en ejecución se llama proceso. La forma en que está cargado en memoria varía según el lenguaje en el que estamos trabajando.

Memory Layout en C++

Stack

Sección del memory layout. Se comporta de forma LIFO. Está compuesta por un set de stack frames y cada uno de estos es una llamada a una función. Cuando llamamos a una función, se crea un nuevo stack frame y se inserta al stack; cuando se hace un return, se quita un stack frame.

Cada stack frame contiene al menos uno de estos

  • Variables dentro del método o función a llamar (variables automáticas).

  • Línea de la función llamando (dónde hacer el return).

  • Parámetros de la función que estoy llamando.

  • El stack gestiona la memoria por usted. Es transparente.

  • Cuando un stack frame sale del stack, todo el almacenamiento se libera automáticamente.

  • Hay un límite conocido en el tamaño de las variables.

El scope de las variables puede ayudar a entender cómo funciona el stack.

Heap

Sección de un proceso de memory layout. No se gestiona automáticamente, hay que tener cuidado.

Tenemos que interactuar directamente con el heap:

Allocate memory (asignar)

Deallocate/ free memory

Resize memory

¿Cómo interactuar con el heap? C provee un API:

  • malloc ↘

          Asignan espacio
    
  • calloc ↗

  • realloc → Reasigna o edita espacio

  • free → Libera espacio

Memory leak example

¿Cuándo crear variables en el heap y cuándo en el stack?

Usar heap cuando:

Necesito asignar largos bloques de memoria.

Usar la variable mucho tiempo.

Crear una estructura que crece dinámicamente.

Usar stack cuando:

Necesito guardar variables pequeñas.

No necesito que se ejecuten fuera de un método.

La variable no crece dinámicamente.

Ventajas y desventajes del Heap y Stack

Heap

✔ El programador controla cuando asigna memoria

✔ El tamaño de la asignación de memoria es controlable

✘ Más trabajo porque el programador gestiona la memoria

✘ El programador puede provocar errores

Stack

✔ Las variables dependen de la ejecución del método

✔ Eficiente en tiempo y espacio

✔ Evita daños colaterales

✘ Short lifetime: Solo existe en el scope del método

✘ No se puede comunicar entre quien hace el llamado y el método donde se crean las variables

Punteros

Hay muchas cosas que solo se pueden hacer con punteros. Cuando una variable se crea, se le asigna memoria a ésta. El puntero no almacena el valor de la variable, sino que solo la apunta. Almacena una referencia a otro valor, o sea, almacena la dirección de memoria de un valor en memoria.

Cualquier puntero toma el mismo espacio: un entero.

¿Cuántos bytes necesito para almacenar un puntero?

Depende del lenguaje: 1 byte, 2 bytes, 4 bytes... Los que equivalgan a un entero en lenguaje.

Tarea Moral

Investigar qué pasa con el stack durante la recursividad.

¿Qué pasa con el stack durante la recursividad?

"Each time a function is called, the address of where to return to and certain information about the caller’s environment, such as some of the machine registers, are saved on the stack. The newly called function then allocates room on the stack for its automatic and temporary variables. This is how recursive functions in C can work. Each time a recursive function calls itself, a new stack frame is used, so one set of variables doesn’t interfere with the variables from another instance of the function."

Tomado de: https://www.geeksforgeeks.org/memory-layout-of-c-program/

Jueves 08/08/19

Este día no tuvimos clases debido al FESTEC.