E
STRUCTURA DE DATOS I Cabudare, febrero 2013
Todo sobre memoria dinámica
Funcionamiento de la memoria dinámica
Memoria Dinámica Puntero Variable puntero
Memorias
Funciones para crear y liberar espacio en memoria dinámica en lenguaje C
C + + — JAVA — VISUAL BASIC — VISIO — C# — Eiffel
Editorial Necesidades de la aplicación y del sistema... Es importante saber que los tipos de datos, tanto simples como estructurados, vistos hasta ahora en los temas anteriores de las asignaturas de Introducción a los Computadores (IC) y Elementos de Programación (EP), sirven para describir datos o estructuras de datos cuyos tamaños y forma se conocen de antemano. Sin embargo, en muchos programas es necesario que las estructuras de datos estén diseñadas de manera que su tamaño y forma varíe a lo largo de la ejecución de aquellos. Con esto se consigue, fundamentalmente, que estos programas funcionen de manera más eficiente y con un aprovechamiento óptimo de los recursos de almacenamiento en memoria principal. Las variables de todos los tipos de datos vistos hasta el momento son denominadas variables estáticas, en el sentido en que se declaran en el programa, se designan por medio del identificador declarado, y se reserva para ellas un espacio en memoria en tiempo de compilación de los programas. Sin embargo, son muchos los lenguajes de programación que ofrecen la posibilidad de crear y destruir variables en tiempo de ejecución, de manera dinámica, a medida que van siendo necesitadas durante la ejecución del programa. Puesto que estas variables no son declaradas explícitamente en el programa y no tienen identificador (nombre) asignado, se denominan variables anónimas. El pseudolengua-
je utilizado en las asignaturas de IC y EP permite el uso de este tipo de variables. Para ello, ofrece los mecanismos y la sintaxis necesaria para su creación, a la vez que proporcionará una manera de referirse a estas variables para el acceso a los datos que contienen y la asignación de valores a los mismos. Todo esto se lleva a cabo mediante el empleo del tipo puntero, cuyas características se expondrán en los siguientes apartados.
Créditos
Editorial U.F.T Autores/Editores/Diseño/Redacción: Angelo Berardinelli.
Luis Bracamonte.
MEMORIA DINAMICA
La memoria dinámica se refiere a aquella memoria que no puede ser definida ya que no se conoce o no se tiene idea del número de la variable a considerarse, la solución a este problema es la memoria dinámica que permite solicitar memoria en tiempo de ejecución, por lo que cuanta más memoria se necesite, más se solicita al sistema operativo. El sistema operativo maneja la memoria gracias al uso de punteros, por la misma naturaleza del proceso nos impide conocer el tamaño de la memoria necesaria en el momento de compilar.
Datos dinámicos: su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecución según se va necesitando.
Una 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. Aunque en C, a partir del estándar C99 se permite la creación de arreglos cuyo tamaño se determina en tiempo de ejecución, no todos los compiladores implementan este estándar. Además, se sigue teniendo la limitante de que su tamaño no puede cambiar una vez que se especifica, cosa que sí se puede lograr asignando memoria de forma dinámica. Una desventaja de la memoria dinámica es que es más difícil de manejar. La memoria estática tiene una duración fija, que se reserva y libera de forma automática. En contraste, la memoria dinámica se reserva de forma explícita y continúa existiendo hasta que sea liberada, generalmente por parte del programador. 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, por lo cual el proceso es muy eficiente. 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.
PUNTERO
Un puntero o apuntador es una variable que da referencia a una región de memoria; en otras palabras es una variable cuyo valor es una dirección de memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una dirección de memoria en la que se encuentra almacenado un valor ' v ' se dice que ' p ' apunta a ' v '. El programador utilizará punteros para guardar datos en memoria en muchas ocasiones, de la forma que se describe a continuación. Los punteros son de amplia utilización en programación y muchos lenguajes permiten la manipulación directa o indirecta de los mismos. La principal razón de ser de los punteros es la de manejar datos alojados en la zona de memoria dinámica o heap (aunque también se pueden manipular objetos en la zona estática), bien sean datos elementales, estructuras (struct en C) u objetos pertenecientes a una clase (en lenguajes Orientados a Objetos). Gracias a esta propiedad, los punteros permiten modelar un grafo, en donde
La siguiente figura muestra tres variables, de tipos char, int y double, y un puntero a cada una de ellas:
Un puntero es una variable cuyo valor es la direcci贸n de memoria de otra variable.
Esquema de memoria con punteros
Las variables tipo puntero deben apuntar al tipo de dato correcto. Si no es asĂ, pueden producirse resultados inesperados. Por ejemplo:
Una variable es un contenedor que almacena un dato de cierto tipo (los cuales son expuestos a respectivos cambios durante un programa). Al declarar una variable, el compilador se preocupa de reservar una cierta cantidad de memoria para trabajar este. En maquinas de 32 bits el valor de un entero es de 4 bytes, mientras que en una de 16 bits el entero vale 2 bytes. (Ojo, que la mayorĂa de los tarros que tengas a tu disposiciĂłn van a ser 32 bits).
CREAR
ACCESO
LIBERAR