La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

MEMORIA DINÁMICA.

Presentaciones similares


Presentación del tema: "MEMORIA DINÁMICA."— Transcripción de la presentación:

1 MEMORIA DINÁMICA

2 El lenguaje C y el manejo de la memoria Todos los objetos tienen un tiempo de vida, es decir, el tiempo durante el cual se garantiza que el objeto exista. En C, existen 3 tipos de duración: estática, automática y asignada. Las variables globales y las variables locales declaradas con el especificador static tienen duración estática. Se crean antes de que el programa inicie su ejecución y se destruyen cuando el programa termina. Las variables locales no static tienen duración automática. Se crean al entrar al bloque en el que fueron declaradas y se destruyen al salir de ese bloque. Duración asignada se refiere a los objetos cuya memoria se reserva de forma dinámica.

3 Para trabajar con datos dinamicos necesitamos dos cosas: 1
Para trabajar con datos dinamicos necesitamos dos cosas:   1.    Subprogramas predefinidos en el lenguaje que nos permitan gestionar la memoria de forma dinamica (asignacion y liberacion).   2. Algun tipo de dato con el que podamos acceder a esos datos dinamicos (ya que con los tipos vistos hasta ahora solo podemos acceder a datos con un tamaño y forma ya determinados).

4 La memoria dinámica es un espacio de almacenamiento que se solicita en tiempo de ejecución. De esa manera, a medida que el proceso va necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas. Un dato importante es que como tal este tipo de datos se crean y se destruyen mientras se ejecuta el programa y por lo tanto la estructura de datos se va dimensionando de forma precisa a los requerimientos del programa, evitandonos así perder datos o desperdiciar memoria si hubiéramos tratado de definirla cantidad de memoria a utilizar en el momento de compilar el programa.

5 Cuando se crea un programa en el que es necesario manejar memoria dinámica el sistema operativo divide el programa en cuatro partes que son: texto, datos (estáticos), pila y una zona libre o heap. En el momento de la ejecución habrá tanto partes libres como partes asignadas al proceso por lo cual si no se liberan las partes utilizadas de la memoria y que han quedado inservibles es posible que se “agote” esta parte y por lo tanto la fuente de la memoria dinámica. También la pila cambia su tamaño dinámicamente, pero esto no depende del programador sino del sistema operativo.

6 La bilbioteca estándar de C proporciona las funciones malloc, calloc, realloc y free para el manejo de memoria dinámica. Estas funciones están definidas en el archivo de cabecera stdlib.h.

7 Uso de malloc, sizeof y free La función malloc reserva un bloque de memoria y devuelve un puntero void al inicio de la misma. Esta definida como: void *malloc(size_t size); Que regresa un apuntador del tipo void *, el cual es el inicio en memoria de la porción reservada de tamaño size. Donde el parámetro size especifica el número de bytes a reservar. En caso de que no se pueda realizar la asignación, devuelve el valor nulo, lo que permite saber si hubo errores en la asignación de memoria.

8 Dado que void * es regresado, C asume que el apuntador puede ser convertido a cualquier tipo. El tipo de argumento size_t esta definido en la cabecera stddef.h y es un tipo entero sin signo. Por lo tanto: char *cp; cp = (char *) malloc(100); intenta obtener 100 bytes y asignarlos a la dirección de inicio a cp. Es usual usar la función sizeof() para indicar el número de bytes, por ejemplo: int *ip; ip = (int *) malloc(100 * sizeof(int) );

9 El compilador de C requiere hacer una conversión del tipo
El compilador de C requiere hacer una conversión del tipo. La forma de lograr la coerción (cast) es usando (char *) y (int *), que permite convertir un apuntador void a un apuntador tipo char e int respectivamente. Hacer la conversión al tipo de apuntador correcto asegura que la aritmética con el apuntador funcionará de forma correcta. Es una buena práctica usar sizeof() aún si se conoce el tamaño actual del dato que se requiere, -- ya que de esta forma el código se hace independiente del dispositivo (portabilidad). La función sizeof() puede ser usada para encontrar el tamaño de cualquier tipo de dato, variable o estructura. Simplemente se debe proporcionar uno de los anteriores como argumento a la función. Por lo tanto: int i; struct COORD {float x,y,z}; struct COORD *pt; sizeof(int), sizeof(i), sizeof(struct COORD) y sizeof(PT) son tambien sentencias correctas.

10 En el siguiente ejemplo se reserva memoria para la variable ip, en donde se emplea la relación que existe entre apuntadores y arreglos, para manejar la memoria reservada como un arreglo. Por ejemplo, se pueden hacer cosas como: main() {    int *ip, i;    ip = (int *) malloc(100 * sizeof(int) );    ip[0] = 1000; for (i=0; i<100; ++i)        scanf("%d",ip++); } Cuando se ha terminado de usar una porción de memoria siempre se deberá liberar usando la función free(). Esta función permite que la memoria liberada este disponible nuevemente quizás para otra llamada de la función malloc() La función free() toma un apuntador como un argumento y libera la memoria a la cual el apuntador hace referencia.

11 VENTAJAS: Es posible disponer de un espacio de memoria arbitrario que dependa de información dinámica (disponible sólo en ejecución): Toda esa memoria que maneja es implementada por el programador cuando fuese necesario. Otra ventaja de la memoria dinámica es que se puede ir incrementando durante la ejecución del programa. Esto permite, por ejemplo, trabajar con arreglos dinámicos. Es memoria que se reserva en tiempo de ejecución. Su tamaño puede variar durante la ejecución del programa y puede ser liberado mediante la función free.

12 DESVENTAJAS: Es difícil de implementar en el desarrollo de un programa o aplicación. Es difícil implementar estructuras de datos complejas como son los tipos recursivos (árboles, grafos, etc.).Por ello necesitamos una forma para solicitar y liberar memoria para nuevas variables que puedan ser necesarias durante la ejecución de nuestros programas: Heap. Una desventaja de la memoria dinámica es que es más difícil de manejar. La memoria dinámica puede afectar el rendimiento. Puesto que con la memoria estática el tamaño de las variables se conoce en tiempo de compilación, esta información está incluida en el código objeto generado. Cuando se reserva memoria de manera dinámica, Se tienen que llevar a cabo varias tareas, como buscar un bloque de memoria libre y almacenar la posición y tamaño de la memoria asignada, de manera que pueda ser liberada más adelante. Todo esto representa una carga adicional, aunque esto depende de la implementación y hay técnicas para reducir su impacto.  


Descargar ppt "MEMORIA DINÁMICA."

Presentaciones similares


Anuncios Google