Hola y bienvenido de nuevo. En esta conferencia, quiero hablar sobre la asignación de memoria dinámica.
Esto está directamente relacionado con los punteros, solo puede emplearlo en
los punteros. Entonces empecemos.
Entonces, cada vez que define una
variable en c, el compilador asigna automáticamente la cantidad correcta de almacenamiento según el tipo de datos.
Hemos visto esto en todas partes. Cuando creamos números enteros, flotantes, dobles, no tenemos que asignar memoria.
El compilador lo hace por ti. De hecho, asigna algo de memoria.
Lo mismo ocurre con los punteros, por cierto. Cuando crea un puntero, se le
asigna memoria para que almacene un tipo de puntero, una dirección.
Eso no significa que la memoria esté asignada para esa dirección.
Hasta este momento, siempre que asignamos datos a un
puntero, siempre le asignamos una variable existente.
Entonces, si quisiéramos asignar
datos a un puntero, usamos la dirección comercial del operador
en una variable que ya tenía memoria asignada.
Pero, ¿qué pasa si desea crear un puntero y no desea asignarle la
dirección de operador, desea asignar memoria dinámicamente? De eso se trata toda esta conferencia.
Por lo tanto, con frecuencia es deseable poder asignar almacenamiento dinámicamente mientras
se ejecuta un programa. Asigne memoria cuando la necesite.
Si tiene un programa diseñado para leer un conjunto de datos de un
archivo en una matriz en la memoria, tiene tres opciones.
Puede definir la matriz para que contenga el número máximo de elementos posibles que compilan en
tiempo, es un tamaño fijo.
Si define la matriz que tiene 50 elementos,
solo contendrá 50 elementos. El compilador determina que es 50,
asignará esa cantidad de memoria cuando se ejecute.
Puede utilizar una matriz de longitud variable para dimensionar el tamaño del tiempo de ejecución de la matriz.
Hablamos un poco sobre estas matrices de longitud
variable, no son compatibles hasta C11. De hecho, están sacando C11, están agregando C99.
Aquí es donde puede introducir variables.
Pero estos siguen siendo una especie de tamaño fijo porque
todo eso significa matrices vinculadas a variables, todo lo que significa es que puede pasar variables por tamaños.
Pero siguen estando estáticos.
O la mejor opción es que puede asignar la matriz dinámicamente cuando la necesite.
Y hay diferentes funciones c a las que puede llamar para hacer esto.
Por tanto, será muy útil poder asignar memoria de forma dinámica.
Entonces, con el primer enfoque que hemos estado haciendo hasta ahora, ya sea una
matriz o un tipo de datos, es un tamaño fijo.
Debe definir su matriz para que contenga la cantidad máxima de elementos
que estarán directamente en una matriz.
Entonces haría algo como esto, int dataArray [1000].
Sin embargo, esto significa que el archivo de datos no puede contener más de mil elementos.
Si lo hace, su programa se romperá.
Por lo tanto, solo tiene que esperar que el archivo que esté leyendo no tenga muchos datos.
Su programa no funcionará con grandes conjuntos de archivos o archivos grandes.
Y si desea trabajar con archivos grandes, debe volver atrás y debe agrandar la matriz.
Tienes que cambiar el tamaño,
pero luego tienes que recompilarlo en todas esas cosas, es tiempo de compilación.
Independientemente del valor que seleccione, siempre tiene la posibilidad de volver
a tener el mismo problema en el futuro porque es de un tamaño fijo.
Este tamaño se determina cuando compila el código,
no se ajusta cuando ejecuta el programa.
No cambia dinámicamente.
Con las funciones de asignación de memoria dinámica, puede obtener almacenamiento cuando lo necesite.
Este enfoque le permite asignar memoria mientras se ejecuta el programa.
Así que piense en las ventajas de esto. En primer lugar,
no crea una tonelada de memoria que
no pueda usar, solo creará la que necesite.
Y si necesita más, puede asignar más.
No es necesario volver atrás, volver a compilar y cambiar el tamaño.
Así que la asignación de memoria dinámica es el camino a seguir.
Depende del concepto de puntero y proporciona
un fuerte incentivo para usar punteros en su código.
Así que hablamos sobre las ventajas de los punteros
y es posible que te hayas pensado bien, está bien, son un concepto genial, pero
¿por qué necesitamos usarlos? Esta
es una de las grandes razones para que puedas asignar memoria de forma dinámica.
Y de nuevo, ¿qué es esto? C se trata de ser un lenguaje eficiente y
no usar una tonelada de memoria.
Por lo tanto, c se ejecuta en sistemas integrados, programación en tiempo real
y esta es una de las razones porque puede limitar la cantidad de memoria
que usa en función de la necesidad.
Por lo tanto, la asignación de memoria dinámica permite que la memoria para almacenar datos se asigne dinámicamente
cuando se ejecuta el programa.
La asignación de memoria dinámicamente solo es posible
porque tiene punteros disponibles.
Debido a que tiene una dirección
y puede cambiar cuánto apunta el puntero, puede reajustar la memoria.
La mayoría de los programas de producción utilizarán la asignación de memoria dinámica.
Si está escribiendo código en c, usará esto.
Incluso si es un principiante, utilizará la
asignación de memoria dinámica. La mayoría de los programas útiles emplearán este concepto.
La asignación de datos de forma dinámica le permite crear punteros en tiempo de ejecución que
son lo suficientemente grandes para contener la cantidad de datos que necesita para la tarea,
por lo que no está desperdiciando memoria. Vital.
También tenemos que hablar sobre el montón frente a la pila.
Hay dos formas de almacenar memoria en un programa, dos estructuras
de datos diferentes que pueden almacenar datos en la pila o pueden almacenar datos
en el montón.
La asignación de memoria dinámica reserva todo en el montón.
No vamos a entrar en detalles sobre cómo están organizados, sino esencialmente.
Cuando almacena datos en el montón, permite
más cambios.
Puede cambiar arbitrariamente el tamaño de los objetos de datos y se queda
mucho más tiempo cuando asigna memoria en un montón, se
queda en la totalidad de su programa.
Cuando usa una pila, es más limitante.
La pila se usa para todo, desde argumentos de función y variables locales.
Ahí es donde se almacenan todos esos.
Y por eso hablamos de la pila de llamadas.
Analizó métodos y
funciones. Utilizo métodos de vez en cuando, pero métodos es realmente un término orientado a
objetos, por lo que funciones.
Todo lo relacionado con las funciones se crea en la pila.
Entonces, lo que eso significa es que cuando ejecuta
una función, se coloca en la pila. Las variables locales se ponen en la pila.
Cuando sale de la función, todo se elimina.
Por lo tanto, la memoria ubicada en la pila no se queda por mucho tiempo.
Esa es una de las razones por las que asigna
memoria dinámicamente, está
en el montón porque controla cuándo la usa y cuándo no la usa, la asigna y la elimina.
Cosas en la pila, no las controlas. Se elimina
automáticamente, se asigna automáticamente.
Entonces, las variables locales, las variables dentro de funciones como la principal,
las que se crean en la pila, etc.
La memoria en el montón es diferente, la controla usted, el programador.
Cuando asigna memoria en el montón, depende de usted realizar un seguimiento de cuándo la memoria que ha
asignado ya no es necesaria, por lo que debe eliminar la memoria.
Tienes que liberar el
espacio cuando ya no lo uses. Y esto es importante
porque la memoria es un recurso muy, muy escaso.
Hoy tenemos mucha memoria que puedes ejecutar en una computadora, 12 gigas,
16 gigas lo que sea. Pero para los
programas integrados que se ejecutan en dispositivos, no
necesariamente tiene tanta memoria. Por lo tanto, desea controlar la cantidad de
memoria que usa y también desea liberar la memoria cuando haya terminado de usarla
para que otras aplicaciones puedan usarla.
Nuevamente, es más importante en los sistemas de tipo embebido de bajo nivel.
Pero esta es una libertad que muchos idiomas no tienen. Esta capacidad de controlar la
memoria de su administrador por parte del programador y puede hacer que
el programa sea mucho más eficiente y mucho más rápido.
Entonces, en la próxima lección, hablaremos sobre cómo se puede
hacer esto, qué funciones se pueden invocar. Obviamente, hay diferentes funciones a las que puede
llamar para asignar memoria a la memoria libre. Gracias.