Memoria estática y memoria dinámica

Ismael Robles
6 Jan 202122:14

Summary

TLDREl guion del video explica los conceptos de memoria estática y dinámica en programación. La memoria estática, asignada durante la compilación, almacena variables globales y estáticas, mientras que la memoria dinámica, gestionada en tiempo de ejecución mediante 'malloc', permite la creación de estructuras de datos como listas enlazadas. Se destaca la diferencia en la asignación de memoria entre ambas, y cómo la pila (stack) y el montículo (heap) son utilizados para almacenar información durante la ejecución de funciones y programas respectivamente. Se menciona también la importancia de los apuntadores para la gestión de la memoria dinámica.

Takeaways

  • 💡 La memoria en un programa se divide en memoria estática y dinámica, dependiendo de cómo se asigna y se utiliza.
  • 📚 La memoria estática se utiliza para almacenar variables cuyo tamaño se conoce en tiempo de compilación y no se puede reutilizar durante la ejecución del programa.
  • 🔍 En la memoria estática, el sistema operativo reserva espacio específico para variables globales y estáticas, y este espacio no se puede liberar o reasignar.
  • 🌐 La memoria dinámica se asigna en tiempo de ejecución y se utiliza para variables cuyo tamaño se determina en tiempo de ejecución, como en el caso de estructuras de datos enlazadas.
  • 🔑 El uso de malloc() permite reservar memoria dinámica en el montículo (heap), permitiendo la creación de estructuras de datos que crecen según sea necesario.
  • 🔄 La memoria dinámica también incluye la pila (stack), que es utilizada para almacenar información sobre las funciones y sus variables locales durante la ejecución del programa.
  • 📉 La pila sigue un modelo LIFO (Last In, First Out), donde se guardan y liberan los contextos de las funciones en orden de ejecución.
  • 🛠️ Los apuntadores son fundamentales para trabajar con memoria dinámica, permitiendo la manipulación y acceso a estructuras de datos complejas.
  • 🛑 La memoria estática ofrece un acceso más rápido a la información debido a que los datos se almacenan de manera contigua, a diferencia de la memoria dinámica.
  • ♻️ La memoria dinámica permite una mayor flexibilidad en la asignación y liberación de memoria, lo que es esencial para programas que requieren estructuras de datos de tamaño variable.

Q & A

  • ¿Qué es la memoria estática y cómo se diferencia de la memoria dinámica?

    -La memoria estática es la región de memoria que se utiliza para almacenar variables cuya cantidad de información es conocida en tiempo de compilación. Se reserva una cantidad fija de espacio al inicio del programa y no se puede reutilizar durante la ejecución. La memoria dinámica, por otro lado, es asignada en tiempo de ejecución y se puede reutilizar durante la ejecución del programa.

  • ¿Cuál es la utilidad de la memoria estática en un programa?

    -La memoria estática se utiliza para almacenar variables globales y estáticas cuya cantidad de datos es conocida y fija. Esto permite al compilador reservar un espacio específico en memoria al inicio del programa, lo que optimiza el acceso a la información ya que se almacena de manera continua.

  • ¿Cómo se representa la memoria dinámica en un programa y cuál es su principal ventaja?

    -La memoria dinámica se representa como una región separada en la memoria del programa, donde se pueden reservar y liberar bloques de memoria en tiempo de ejecución. Su principal ventaja es la capacidad de crecer dinámicamente según las necesidades del programa, permitiendo la creación de estructuras de datos complejas y el manejo de grandes cantidades de datos.

  • ¿Qué es el montículo (heap) y cómo se relaciona con la memoria dinámica?

    -El montículo es una sección de la memoria dinámica donde se almacenan las estructuras de datos dinámicas como listas enlazadas y matrices. Se utiliza para reservar memoria en tiempo de ejecución mediante funciones como malloc, y permite la creación de estructuras que crecen o se reducen según sea necesario.

  • ¿Qué es la pila (stack) y cómo se diferencia del montículo?

    -La pila es una región de la memoria dinámica que se utiliza para almacenar información relacionada con las funciones y sus variables locales. Se diferencia del montículo en que la pila se utiliza para mantener un registro de la ejecución de funciones y sus variables temporales, mientras que el montículo se utiliza para almacenar datos de una manera más permanente y estructurada.

  • ¿Cómo se gestiona la memoria en la pila durante la ejecución de funciones en un programa?

    -Cuando una función se ejecuta, su información, como argumentos y variables locales, se almacena en la pila. Cuando la función termina, su información se elimina de la pila y el programa regresa al nivel anterior, permitiendo así una gestión eficiente del estado de ejecución del programa.

  • ¿Qué es un apuntador y cómo se relaciona con la memoria dinámica?

    -Un apuntador es una variable que contiene la dirección de memoria de otra variable. Se relaciona con la memoria dinámica porque permite reservar y acceder a memoria en el montículo, permitiendo la creación y manipulación de estructuras de datos complejas.

  • ¿Por qué es importante el uso de apuntadores en programación de C y C++?

    -Los apuntadores son fundamentales en C y C++ porque permiten una manipulación directa de la memoria, lo que es esencial para la creación de estructuras de datos complejas y la optimización del rendimiento del programa. También son necesarios para trabajar con memoria dinámica y funciones que toman arreglos o matrices como argumentos.

  • ¿Cuál es la desventaja principal de utilizar memoria dinámica en comparación con memoria estática?

    -La desventaja principal de la memoria dinámica es que, a diferencia de la memoria estática que se almacena de manera continua, la memoria dinámica no es necesariamente continua. Esto puede resultar en un acceso menos óptimo a la información, ya que puede requerir 'salto de punteros' para acceder a diferentes partes de una estructura de datos.

  • ¿Cómo se puede liberar la memoria asignada dinámicamente en un programa?

    -La memoria asignada dinámicamente se puede liberar mediante funciones como free en C, que permiten devolver el espacio de memoria al sistema operativo, haciendo que esté disponible para futuras asignaciones.

Outlines

00:00

💾 Memoria Estática y Dinámica

Este párrafo introduce los conceptos de memoria estática y dinámica en el contexto de la ejecución de programas. Se explica que las variables en un programa requieren almacenamiento de información y que este almacenamiento se divide en memoria estática y dinámica. La memoria estática se utiliza para variables cuyo tamaño se conoce en tiempo de compilación, mientras que la memoria dinámica es para variables cuyo tamaño se determina en tiempo de ejecución. Se ilustra con un ejemplo de un programa simple que declara una variable global y cómo el sistema operativo asigna memoria estática para dicha variable.

05:01

🔄 Limitaciones de la Memoria Estática

Este párrafo profundiza en las características de la memoria estática, destacando que una vez que se asigna espacio para variables globales, este no puede ser reutilizado durante la ejecución del programa. Esto significa que la memoria asignada permanece ocupada incluso si ya no se utiliza la variable. En contraste, la memoria dinámica permite la asignación y liberación de memoria en tiempo de ejecución, lo que es útil para estructuras de datos que crecen dinámicamente, como listas enlazadas. Se menciona el uso de la función 'malloc' para reservar memoria dinámica y cómo esta memoria no está necesariamente contigua, lo que puede afectar el rendimiento al acceder a datos分散 en diferentes segmentos de memoria.

10:02

🗑️ Liberación de Memoria Dinámica

Este párrafo aborda la capacidad de liberar memoria en la memoria dinámica, una característica que no es posible con la memoria estática. Se describe cómo, a diferencia de la memoria estática, la memoria dinámica permite reutilizar el espacio previamente asignado a variables que ya no son necesarias. Esto es especialmente útil para programas que requieren estructuras de datos que se modifiquen en tamaño durante la ejecución. Además, se explica que la memoria dinámica se divide en dos secciones: el montículo (heap) y la pila (stack), con el montículo siendo donde se almacenan las reservas de memoria realizadas con 'malloc'.

15:04

📚 Funcionamiento de la Pila (Stack)

Este párrafo describe el papel de la pila (stack) en la memoria dinámica, que se utiliza para almacenar información sobre las funciones y variables locales en ejecución. Se ilustra cómo la pila se comporta como una estructura de datos de tipo 'pila', donde se agregan y eliminan niveles correspondientes a las funciones invocadas y su ejecución. Se explica que cuando se invoca una función, se agrega un nivel a la pila con información sobre los argumentos y variables locales, y cuando la función termina, se elimina ese nivel, permitiendo el regreso al estado anterior del programa.

20:04

🛠️ Configuración del Ambiente de Trabajo para Programación

El último párrafo se desplaza hacia la configuración del entorno de trabajo para la programación, mencionando la necesidad de aprender a usar apuntadores para reservar memoria en el montículo y crear estructuras de datos dinámicas. Se anuncia que en el siguiente vídeo se mostrará cómo configurar e instalar el ambiente de trabajo para programar en C, lo que implicará un enfoque en la utilización de apuntadores y la gestión de la memoria dinámica.

Mindmap

Keywords

💡Memoria Estática

La memoria estática se refiere a la región de memoria de una computadora que se utiliza para almacenar variables cuyo tamaño se conoce en tiempo de compilación. Esto permite que el sistema operativo reserve un espacio fijo en la memoria durante la ejecución del programa. En el guion, se menciona que la memoria estática se utiliza para variables globales, y una vez que se asigna, no se puede reutilizar durante la ejecución del programa. Por ejemplo, una variable global 'a' que almacena el número 5, requiere 4 bytes en una computadora de 64 bits, y el sistema operativo reserva exactamente ese espacio en la memoria estática.

💡Memoria Dinámica

La memoria dinámica es la región de memoria que se utiliza para almacenar variables cuyo tamaño se determina en tiempo de ejecución. Esto permite una mayor flexibilidad ya que el programa puede solicitar memoria adicional cuando sea necesario. En el guion, se explica que la memoria dinámica se utiliza para variables cuyo tamaño no se conoce en tiempo de compilación y se asigna en tiempo de ejecución mediante instrucciones como 'malloc'. Esto permite representar estructuras de datos dinámicas, como listas enlazadas, que pueden crecer según sea necesario.

💡Variables Globales

Las variables globales son aquellas que se declaran fuera de cualquier función y son accesibles desde cualquier punto del programa. En el contexto del video, las variables globales se almacenan en la memoria estática, ya que su tamaño es conocido en tiempo de compilación. El guion menciona que si se declara una variable global 'a' con un valor inicial de 5, el compilador sabe que necesitará 4 bytes y reserva ese espacio en la memoria estática.

💡Montículo (Heap)

El montículo es una sección de la memoria dinámica donde se almacenan los objetos dinámicos y las estructuras de datos como listas enlazadas. En el guion, se menciona que todo lo que se reserva usando 'malloc' se guarda en el montículo. Este espacio de memoria permite la creación de estructuras de datos dinámicas que pueden crecer y cambiar de tamaño a medida que se ejecuta el programa.

💡Pila (Stack)

La pila es otra sección de la memoria dinámica que se utiliza para almacenar información relacionada con las funciones y sus llamadas, incluyendo variables locales y parámetros de funciones. En el guion, se describe cómo la pila se utiliza para llevar un registro de en qué función se encuentra el programa en ese momento, qué variables locales tiene esa función y permite regresar al nivel anterior una vez que la función termina su ejecución.

💡malloc

malloc es una función en C y C++ que se utiliza para reservar un pedazo de memoria dinámica de un tamaño especificado por el programador. En el guion, se explica que malloc se utiliza para asignar memoria en el montículo, y se puede invocar varias veces para crear diferentes bloques de memoria, como nodos en una lista enlazada.

💡Variables Locales

Las variables locales son aquellas que se declaran dentro de una función y solo son accesibles desde esa función. En el guion, se menciona que las variables locales se almacenan en la pila, y su información se guarda temporalmente mientras se ejecuta la función. Una vez que la función termina, la memoria asociada con las variables locales se libera.

💡Apuntadores

Los apuntadores son variables que almacenan la dirección de memoria de otra variable. Son fundamentales en la manipulación de memoria dinámica y en la creación de estructuras de datos complejas. En el guion, se sugiere que los apuntadores son esenciales para trabajar con memoria dinámica, permitiendo la creación y manipulación de estructuras como listas enlazadas.

💡Estructuras de Datos Dinámicas

Las estructuras de datos dinámicas son aquellas que pueden crecer o reducirse en tamaño durante la ejecución del programa. En el guion, se da como ejemplo las listas enlazadas, que se pueden representar usando memoria dinámica asignada con malloc. Estas estructuras son útiles para manejar colecciones de datos que cambian de tamaño a medida que se ejecuta el programa.

💡Optimización del Acceso a Memoria

La optimización del acceso a memoria se refiere a técnicas para mejorar la velocidad de acceso a los datos almacenados en la memoria. En el guion, se menciona que la memoria estática permite un acceso óptimo a la información porque los datos se almacenan de manera continua en un bloque, lo que es más eficiente que tener que 'saltar' entre diferentes bloques分散 en la memoria dinámica.

Highlights

Memorias estática y dinámica son áreas de memoria en la computadora para almacenar información de programas.

La memoria estática se utiliza para almacenar variables cuyo tamaño se conoce en tiempo de compilación.

La memoria dinámica se utiliza para almacenar variables cuyo tamaño se asigna en tiempo de ejecución.

El sistema operativo asigna una región de memoria para cada programa ejecutado.

La memoria estática incluye espacio para variables globales y estáticas.

La memoria dinámica permite la asignación y liberación de espacio durante la ejecución del programa.

El acceso a la memoria estática es más rápido debido a la continuidad del almacenamiento.

La memoria dinámica permite la creación de estructuras de datos que crecen dinámicamente.

El montículo (heap) es la sección de memoria dinámica usada para asignar memoria con malloc.

La pila (stack) es usada para almacenar información sobre la ejecución de funciones y sus variables locales.

Cuando una función termina, su información es eliminada de la pila.

La pila mantiene un registro de la ejecución del programa y las variables locales de cada función.

Los apuntadores son esenciales para trabajar con memoria dinámica y estructuras de datos en C.

Se necesitará aprender a usar apuntadores para reservar memoria en el montículo y crear estructuras de datos dinámicas.

El siguiente vídeo se centrará en la configuración e instalación del ambiente de trabajo para programar en C.

Transcripts

play00:00

vamos a ver ahora los conceptos de

play00:02

memoria estática y de memoria dinámica

play00:05

entonces recordarán que cuando se

play00:08

ejecuta un programa pues ese programa en

play00:11

un programa usa variables y las

play00:14

variables se usan para almacenar

play00:15

información del programa

play00:17

entonces esa información se tiene que

play00:21

asignar se tiene que almacenar en alguna

play00:23

región en memoria de la computadora ok

play00:27

entonces básicamente existen dos áreas

play00:31

de memoria en la cual se puede almacenar

play00:34

esa información está lo que se conoce

play00:37

como memoria estática sí y está también

play00:42

lo que se conoce como memoria dinámica

play00:45

entonces cuando ustedes se ejecutan su

play00:48

programa el sistema operativo asigna una

play00:50

región de memoria para su programa y esa

play00:52

región se divide básicamente en dos

play00:54

áreas en esa que es la memoria estática

play00:57

que básicamente se usa para almacenar

play01:00

variables que se conoce cuál va a ser el

play01:04

tamaño total que va a necesitar la

play01:06

información que se va a guardar en esa

play01:08

variable en tiempo de compilación ok

play01:15

está también lo que se conoce como

play01:16

memoria dinámica y la memoria dinámica

play01:20

básicamente va a almacenar información

play01:24

de variables

play01:26

cuya cuya información se indica que se

play01:30

asigne cuando se está ejecutando su

play01:32

programa en tiempo de ejecución

play01:36

me parece que esto es más fácil

play01:38

explicarlo que explicarlo haciendo un

play01:40

dibujito entonces

play01:47

cómo funciona esto es básicamente de la

play01:48

siguiente manera en el caso de sem

play01:51

ustedes por ejemplo pueden hacer un

play01:53

programa

play01:54

muy básico que ustedes podrían hacer un

play01:57

programa que sea de esta manera un pin

play02:00

con un

play02:01

maine

play02:03

play02:05

y pues este programa no voy a poner todo

play02:08

el detalle quería aquí solamente el

play02:10

e-mail pero vamos a suponer que este es

play02:12

esto es lo que tiene su programa y que

play02:14

usted declararon aquí arriba una

play02:15

variable global

play02:17

vamos a suponer que esta variable global

play02:19

se llama a y que almacén un número que

play02:23

es un 5 ok

play02:25

y de este lado derecho voy a pintar un

play02:27

recuadro que va a representar la

play02:29

información va a representar la memoria

play02:32

que se le asignó a su programa el

play02:34

sistema operativo les asignó su programa

play02:36

aquí vamos a poner memoria

play02:43

y entonces como les comentaba en la

play02:45

dispositiva anterior pues esta memoria

play02:47

se va a dividir en dos regiones una

play02:49

región

play02:50

que va a ser la memoria estática este de

play02:54

aquí vamos a llamar la estática

play03:01

y esta otra de aquí que va a ser la

play03:04

memoria dinámica

play03:10

la región de memoria dinámica entonces

play03:14

cuanto ustedes tienen este programa y lo

play03:17

complican si se fijan pues el compilador

play03:19

inmediatamente sabe al ver su código que

play03:22

esta variable que están declarando aquí

play03:25

esta variable ah

play03:27

esta de aquí es una variable global que

play03:30

es el tipo entero

play03:32

entonces en la mayoría de los

play03:34

computadores de 64 bits eso significa

play03:36

que van a requerir 4 bytes y entonces lo

play03:40

que hacen cuando se discuta su programa

play03:42

lo que es el sistema operativo es que

play03:43

reserva en la región de memoria estática

play03:47

exactamente 4 bytes

play03:51

para almacenar esta variable

play03:57

y si tienen más variables globales va a

play04:00

ser lo mismo con esas otras variables

play04:01

globales dependiendo de cuál sea el

play04:03

tamaño de esa variable google global va

play04:05

a almacenar exactamente ese tamaño aquí

play04:08

en la región de memoria estática antes

play04:10

podría entender a la mejor trabar y

play04:12

hable desde otra variable ce que sean

play04:14

globales y que se van a almacenar aquí

play04:16

en esta región de memoria estática ok

play04:21

vamos a pintar esta franja aquí para que

play04:22

quede más claro que a partir de esta

play04:25

línea comienza la memoria dinámica

play04:28

entonces el hecho de que el compilador

play04:31

sea bien sepa de antemano cuánto va a

play04:34

ocupar el espacio en la variable permite

play04:36

por ejemplo que pueda almacenar la

play04:38

información de manera continua y esto en

play04:41

particular tiene la ventaja de que

play04:43

optimiza el acceso a esta información

play04:45

porque como está contigo ustedes cuando

play04:47

quieren acceder a la información de una

play04:48

variable en particular saben que la

play04:51

información de toda esa variable está

play04:52

almacenada de manera continua en un

play04:54

bloque en este caso es un entero pero

play04:56

podría ser otro tipo de dato más grande

play05:00

es importante que noten que en el caso

play05:02

de la memoria estática una vez que se

play05:06

asignó este espacio para algunas de sus

play05:08

variables globales este espacio ya no

play05:11

puede ser reutilizado durante toda la

play05:13

ejecución de su programa ok entonces

play05:15

esta variable y la región que ocupa en

play05:18

esta parte de la memoria estática ya no

play05:21

es posible más adelante en su programa y

play05:24

liberar este espacio en memoria aunque

play05:26

ustedes ya no vayan a utilizar esa

play05:27

variable global ya no pueden liberar

play05:29

esta memoria y usarla para ocupar y para

play05:32

almacenar otra variable por ejemplo

play05:34

entonces desde que inicia su programa

play05:36

hasta que termina esta región se va a

play05:39

asignar exclusivamente a la variable a y

play05:42

ya no se va a poder volver a ya no se va

play05:44

a poder volver a ocuparla

play05:47

entonces eso es algo muy característico

play05:48

de la memoria estática no pueden

play05:50

reutilizar la las secciones de memoria

play05:53

que ya les hayan asignado a sus

play05:54

variables y pues la información de la de

play05:59

las variables que está almacenando se

play06:00

sabe de entrada desde desde que arranca

play06:03

su programa se sabe cuánta información

play06:05

va almacenar cada una de estas variables

play06:09

en el caso de la memoria dinámica pues

play06:12

la cosa es bastante diferente porque la

play06:16

memoria dinámica en el caso de ce entre

play06:20

otros casos de bausch se va a crear se

play06:22

va a usar perdón de usar cuando ustedes

play06:24

usen en la instrucción malo entonces si

play06:28

ustedes aquí en su programa tuvieran

play06:29

esta instrucción malo que vamos a ver

play06:31

más adelante para qué sirve pero en

play06:32

esencia es una instrucción que les

play06:35

permite decirle al sistema operativo que

play06:37

les reserve un pedazo de memoria el que

play06:40

ustedes lo indiquen en la sección en la

play06:43

región de memoria dinámica entonces este

play06:47

malo podría usarse por ejemplo para

play06:48

guardar para almacenar cierta cantidad

play06:50

de bytes

play06:52

aquí está esa cantidad de bytes se

play06:54

estarían reservando en esta sección de

play06:56

la memoria dinámica y ustedes pueden

play06:58

invocar pues tantas veces como quieran

play07:01

llamarlo para almacenar diferentes

play07:03

bloques de memoria la idea de usar esto

play07:06

este comando malo y la memoria dinámica

play07:09

es básicamente para representar

play07:11

estructuras de datos como las que les

play07:15

mencionaba

play07:15

en el vídeo anterior

play07:18

esta estructura de datos que era una

play07:19

lista no se acuerdan del vídeo anterior

play07:21

que teníamos que en estas listas tenían

play07:23

un nodo y estos nodos usualmente apuntan

play07:25

o tienen alguna algún mecanismo que les

play07:27

permite saber quién es un nodo es un

play07:31

modo vecino pues por ejemplo aquí

play07:33

podríamos tener una lista que tiene el 5

play07:35

luego tiene el 7 y luego apunta a otro

play07:38

nuevo que podría ser

play07:40

el 10 ok

play07:43

entonces pues esta lista enlazada si

play07:47

ustedes quisieran representar la vamos a

play07:49

usar otro color porque estamos dando

play07:50

mucho rojo

play07:53

si ustedes quieren representar están

play07:56

esta lista enlazada lo que podrían hacer

play07:59

es invocar en malloco tres veces para

play08:01

reservar cada uno de estos nodos

play08:02

entonces una primera llamada del malo

play08:05

que les podría reservar

play08:10

un segmento de memoria digamos este

play08:12

pedacito aquí en la memoria dinámica

play08:19

y a diferencia de la memoria estática

play08:21

ustedes cuando invocan el comando malo

play08:24

no tienen garantía de que esa región de

play08:26

memoria vaya a estar pegada a otra

play08:28

región que previamente habían reservado

play08:30

y lo más probable es que cuando invocan

play08:32

el mal o para guardar para que les cree

play08:36

una región en memoria que les permite

play08:39

almacenar este número 7 probablemente lo

play08:42

haga en otros elementos que ni siquiera

play08:44

es contigo bueno aquí en la línea ya me

play08:46

fue un poco chueco pero aquí básicamente

play08:48

le reservaría a este otro bloque

play08:50

entonces no necesariamente va a ser

play08:52

contigo y contigo en la región de

play08:54

memoria dinámica y pues otra llamada al

play08:56

comando malo pues podrían usarla para

play08:58

almacenar otro segmento más

play09:02

entonces básicamente parece su sala

play09:04

memoria dinámica para que ustedes puedan

play09:06

crear estas estructuras dinámicas estas

play09:07

estructuras de datos dinámicas que

play09:10

pueden ir creciendo según lo requiera su

play09:12

programa y la información que necesitan

play09:15

esas estructuras pues se usa se reservan

play09:19

usando este comando malo que en el caso

play09:20

de s

play09:21

y

play09:24

algo también importante que de qué tiene

play09:26

la memoria dinámica con respecto a la

play09:28

memoria estática es que estas regiones

play09:32

si se pueden liberar si ustedes ya no

play09:35

necesitan usar esta información

play09:38

por ejemplo podría ser que en su

play09:39

programa ustedes ya reservaron la

play09:41

información la región la región en los

play09:44

bloques de memoria para esta lista y

play09:47

ustedes deciden que en esta lista pues

play09:49

ya van a borrar este primer nodo

play09:50

entonces en su programa en alguna parte

play09:53

indican que van a borrar ese primer nodo

play09:56

hay una manera de hacerlo

play09:57

programáticamente y vamos a ver más

play09:59

adelante cómo se hace eso pero el punto

play10:01

aquí es que éste llevaron el nodo que

play10:03

tenía el número 5 y pues ya no necesitan

play10:05

realmente que esta región de memoria que

play10:08

habían reservado originalmente siga

play10:09

ocupada entonces a diferencia de la

play10:13

memoria estática ustedes si pueden

play10:15

liberar regiones de memoria d

play10:20

región de memoria dinámica

play10:22

y eso les permite entonces que en su

play10:25

programa si más adelante

play10:27

pues ustedes a la mejor agregan otro

play10:29

nuevo nodo de nuevo otra vez no sé un 17

play10:35

pues eso les permite reutilizar esas

play10:38

regiones de memoria entonces podrían

play10:39

adoraba esa región que previamente

play10:41

liberado por ahora la pueden

play10:45

ocupar para llenar o para almacenar este

play10:49

número 17

play10:51

y eso es algo muy práctico que tiene la

play10:54

memoria dinámica

play10:56

la ventaja que tiene con respecto a la

play10:58

memoria de estática es esta cuestión de

play11:00

que puedan pueden crear estructuras que

play11:02

crezcan el tamaño dinámicamente

play11:05

el problema que hay la desventaja que

play11:06

hay es que como no son regiones de

play11:09

memoria contiguas

play11:11

el acceso a estos pedacitos de

play11:13

información implica que tengan tienen

play11:15

que hacer saltitos si si ustedes quieren

play11:17

saber la información del por ejemplo del

play11:20

nodo 17 al 10 tienen que usar algo que

play11:22

se conoce en one en el caso de en el

play11:24

caso de ese tiene que es algo que se

play11:26

conoce como apuntador es y vamos a ver

play11:27

en la siguiente clase que me refiero con

play11:29

esto pero básicamente tienen que usar

play11:31

esos apuntador es para que estas

play11:33

segmento en memoria salten a este otro

play11:36

segmento si quieren acceder a la

play11:37

información del 7 y luego el segmento

play11:39

del 10

play11:40

hacer esto saltitos

play11:42

pues puede en general no es muy costoso

play11:46

pero no es tan óptimo como si tuvieran

play11:49

toda la región en memoria de de forma

play11:51

continua

play11:52

entonces es una cuestión que tiene la

play11:56

memoria dinámica pero nos permite

play11:57

almacenar memoria pues

play12:01

nos puedes reservar les permite reservar

play12:02

memoria para sus estructuras que crecen

play12:04

de manera dinámica

play12:08

entonces

play12:10

en el caso específico de cm

play12:16

en el caso específico de la memoria

play12:18

dinámica se encuentra dividida en dos

play12:20

partes

play12:21

entonces ya vimos qué es esto de memoria

play12:23

estática y les comentaba ahorita de que

play12:25

básicamente se usa para almacenar

play12:27

memorias globales pero también la pueden

play12:29

usar en el bueno en el caso de ese

play12:30

también se las variables que crean con

play12:33

el keyword static es decir las variables

play12:36

que son del tipo estáticas también se

play12:38

guardan en la memoria estática pero en

play12:40

el caso de ser pues la memoria dinámica

play12:42

se divide en dos partes en algo que se

play12:45

conoce como el montículo el hit y otro

play12:48

sección que se conoce como la pila el

play12:51

stack ok entonces igual creo que esto es

play12:54

mejor verlo con un dibujito que ya vimos

play12:57

ahorita que entonces en este ejemplo

play12:59

pues teníamos la memoria estática y ésta

play13:01

que era la memoria dinámica

play13:03

ence todo lo que ustedes guardan en

play13:07

memoria dinámica usando esta instrucción

play13:09

malo

play13:11

todo esto todas todas estas variables

play13:14

que se que se crean usando bueno que

play13:17

cuyo espacio se ve se resuelve usando un

play13:19

mal o se guardan en la región que se

play13:21

conoce como el hip el montículo

play13:24

si esto es realmente todo lo que

play13:26

estaríamos invocando aquí el malo todo

play13:28

está puesto que está aquí

play13:31

realmente estaría siendo parte en el

play13:33

caso de ese todo esto sería parte del

play13:35

hip

play13:37

ok

play13:41

entonces

play13:42

y ya en el caso de ese en concreto

play13:44

habría otra como parte de la memoria

play13:47

dinámica habría otra región aquí está la

play13:51

que quiso y que estoy pintando negro

play13:53

esta región sería parte de lo que se

play13:56

conoce como el stack la pila

play13:59

y entonces hoy te vamos a ver a qué me

play14:02

refiero con esto del stack que es

play14:04

exactamente lo que guarda el stack pero

play14:06

es importante que recuerden que en el

play14:07

caso de ese el hit básicamente almacena

play14:10

toda la información de las variables que

play14:12

crean usando el comando malo

play14:16

ok en el caso del stack el stack para

play14:22

explicarlo creo que vale la pena hacer

play14:23

aquí un pequeño ejemplo

play14:25

y básicamente si ustedes por ejemplo

play14:27

tienen su método otra vez su método main

play14:34

imagínense que su programa es más o

play14:35

menos de esta forma y el método main a

play14:38

su vez dentro en el código por aquí

play14:40

invoca una función a la función f 1 la

play14:44

mejor esta función de pasa el número 5

play14:46

por ejemplo

play14:49

y esta función f 1 vamos a suponer que

play14:54

pues recibe un número entero

play14:59

y a su vez esta función f1 invoca a otra

play15:03

función f 2 con otro número por ejemplo

play15:06

el 10 y pues ya aquí abajo va a estar

play15:10

definido f 2

play15:12

vamos a ponerle aquí el link d

play15:16

y aquí pues tiene todo su respectivo

play15:18

código no entonces tenemos estas tres

play15:20

funciones en nuestro código ok

play15:25

entonces

play15:28

en

play15:33

esto te es la pila esto del stack

play15:36

básicamente es una región en memoria que

play15:40

se usa para llevar como que para como

play15:43

para llevar la cuenta como para llevar y

play15:46

para guardar básicamente la información

play15:48

de en qué parte del código están

play15:50

ejecutando su bueno que parte del código

play15:54

se está ejecutando y qué variables se

play15:56

requieren en ese momento sí entonces

play15:59

vamos a hacer otro dibujito aquí para

play16:01

representar el stack el stack

play16:02

básicamente es como es básicamente o

play16:05

está representado como una pila está

play16:08

estructura este tipo debate este tipo de

play16:11

abstracto de datos que les comenté en el

play16:13

vídeo anterior y la idea es básicamente

play16:15

que en esto del stack

play16:18

en la pila

play16:21

cuando ustedes en su programa se ejecuta

play16:24

este comando el main

play16:26

esta función mail perdón en el estado se

play16:30

va a reservar una región

play16:32

de memoria y en esta región de memoria

play16:35

se va a almacenar que están ejecutando

play16:36

el comando main

play16:38

perdón de la función main se va a

play16:41

guardar que argumentos le pasaron a la

play16:44

función en este caso no le pasamos

play16:45

ninguno y se va a guardar también si

play16:48

tiene variables locales

play16:51

vamos a poner aquí una variable local

play16:53

para qué queremos claro esto entonces

play16:54

supongan sé que aquí

play16:57

antes de que se ejecute la función f 1

play16:59

por aquí teníamos una línea que estaba

play17:02

declarando una variable local vamos a

play17:04

llamarle pues se y se guardaba

play17:08

originalmente el número 15 por ejemplo

play17:11

entonces en el stack se guardaría que

play17:14

cuando ejecuto cuando se ejecuta el

play17:16

método main que estamos ejecutar métodos

play17:18

20 en argumentos y que este método main

play17:21

requiere localmente

play17:25

localmente requiere una variable del

play17:27

tipo int que esté esta variable ce con

play17:31

este valor el 15

play17:35

y cuando llegue a esta línea de aquí al

play17:37

f1 vamos a ponerte con otro color

play17:41

cuando se se ejecuta esta línea de aquí

play17:43

de f1 entonces lo que hace el stack es

play17:47

que ahora invoca esta función bueno más

play17:49

bien en el programa ejecuta esta función

play17:51

f 1 y lo que hace es que en el estado va

play17:55

a colocar otro nivel en la pila que va a

play17:58

ser para la función f 1

play18:02

y como la función f no le invocamos

play18:03

pasando el 5 entonces va a guardar esa

play18:06

información va a guardar en la pila que

play18:08

invocamos a las funciones de 1 con el

play18:11

número 5 y si esta función fue una suma

play18:14

además tuviera también su respectiva

play18:16

variable local por ejemplo vamos a poner

play18:18

aquí que tenía un tinte igual a 8

play18:22

esa información de la variable local que

play18:26

necesita también se guardaría aquí link

play18:29

de igual a 8

play18:31

esto es una representación abstracta de

play18:33

cómo funciona el programa no en realidad

play18:35

la estructura se representa un poquito

play18:36

diferente pero esto les da una idea

play18:38

intuitiva de qué es lo que hace la pila

play18:41

entonces finalmente por ejemplo cuando

play18:44

ya se ejecuta esta tercera línea del

play18:46

perdón esta función f 2

play18:49

vamos a poner este con color azul otra

play18:51

vez

play18:52

entonces cuando su programa ahora

play18:55

ejecuta la función f 2 pues ahora tiene

play18:57

que indicar que está ejecutando la

play19:01

función f 2 entonces va a ser va a

play19:04

agregar otro nivel a la pila y ahora va

play19:06

a decir que invocaron a la función f 2

play19:08

con el 10 y pues esta función f no

play19:12

estuviera sus respectivas variables

play19:14

locales pues también se asignarían en

play19:15

esta en este nivel

play19:18

cuando termina de ejecutarse la función

play19:20

f 2 entonces el programa pues ya no

play19:25

requiere ya no requieren información de

play19:26

las variables locales que tenían las

play19:28

funciones de 2 ni tampoco ya necesita

play19:30

guardar que ustedes estaban invocando a

play19:33

la función f 2 con el argumento y es

play19:34

entonces cuando ya terminaron de

play19:36

ejecutar está esta función efectos

play19:38

cuando ya están en la siguiente línea

play19:40

esta de aquí lo que va a ocurrir es que

play19:42

él

play19:44

el programa bueno más bien ayudado por

play19:48

el sistema operativo lo que va a hacer

play19:50

es que automáticamente va a liberar este

play19:52

nivel va a remover este nivel entonces

play19:54

este nivel de aquí se va a remover de la

play19:57

pila

play19:58

y ahora cómo están regrese como ya

play20:01

terminaron de ejecutar la línea de f2

play20:03

perdón la línea que está delante la

play20:05

función de f2

play20:07

pues lo que va a ocurrir ahora es que

play20:10

terminando esta línea y terminando en la

play20:13

ejecución de la función f 1 pues van a

play20:15

regresar o van a ejecutar ahora esta

play20:17

siguiente línea donde se habían quedado

play20:19

originalmente en el main y cuando eso

play20:21

pase cuando terminan de ejecutar a la

play20:23

función f 1

play20:24

otra vez se va a volver a invocar

play20:28

bueno de la pila se va a volver a

play20:30

remover es bueno se va a remover este

play20:32

nivel el que estaba asociado a la

play20:34

función f 1 y entonces regresan al nivel

play20:39

que les correspondía del método main y

play20:42

pues ya nada más tienen la información

play20:44

en memoria de las variables locales del

play20:47

método main entonces en esencia pues la

play20:50

pila sirve básicamente para eso para

play20:52

llevar un registro de en qué función se

play20:55

encuentran actualmente del programa qué

play20:58

variables locales tiene esa función y

play21:00

cuando se termine la ejecución de esa

play21:02

función pues pueden inmediatamente

play21:04

regresar al nivel anterior que es

play21:06

básicamente la última línea en la que se

play21:09

estaba ejecutando el programa entonces

play21:14

esta es nuestra parte de la memoria

play21:17

dinámica en el caso de ese les digo

play21:20

recuerden que en el caso de set que

play21:22

tienen el montículo y la pila

play21:26

y bueno en este curso vamos a necesitar

play21:30

vamos a tener que aprender a usar muy

play21:33

bien la cuestión de los apuntadores como

play21:35

estamos trabajando en se necesitamos

play21:37

saber usar los apuntadores para poder

play21:39

reservar memoria en el montículo y poder

play21:42

crear dinámicamente estas estructuras de

play21:45

datos que les comentaba en el vídeo

play21:48

anterior y que más adelante iremos

play21:50

viendo muchas otras estructuras de datos

play21:51

diferentes entonces

play21:55

y cómo funcionan estos apuntadores es

play21:59

algo que veremos en la siguiente clase

play22:00

lo que ahora les voy a mostrar en el

play22:02

siguiente vídeo es más bien vamos a ver

play22:05

cómo configurar e instalar su ambiente

play22:07

de trabajo si quieren programar ence y

play22:11

eso lo veremos en el siguiente vídeo

Rate This

5.0 / 5 (0 votes)

相关标签
Memoria EstáticaMemoria DinámicaProgramaciónVariablesAlmacenamientoSistemas OperativosEstructuras de DatosApuntadoresOptimizaciónAdministración de Memoria
您是否需要英文摘要?