• Lunes 23 de Diciembre de 2024, 00:47

Autor Tema:  Memoria Dinamica  (Leído 1796 veces)

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Memoria Dinamica
« en: Lunes 13 de Junio de 2005, 19:57 »
0
Hola a todos, una preguntita estoy viendo memoria dinamica, y el ingeniero que nos dio un ejemplo pero no le entendi nada, sera que alguno de ustedes me podria enseñar en realidad como funciona todo eso de la memoria dinamica, y si sera mucho molestia que me envien un ejemplito sobre como va la estructura del programa...

Gracias....


 :smartass:
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #1 en: Lunes 13 de Junio de 2005, 20:50 »
0
Disculopen sera que habra alguien de este foro que sepa de memoria dinamica ?????

Que me de una ayudadita


 :unsure:  :blink:
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #2 en: Lunes 13 de Junio de 2005, 21:16 »
0
Hola, la memoria dinámica no es más que memoria que se reserva en tiempo de ejecución, esto es, cuando realizas un programa en C, tienes que declarar todas las variables que vas a usar y el compilador junto con el SO te da una zona de memoria donde guarda esas variables con el tamaño que le has indicado.  Supón ahora que no sabes cuanta memoria vas a necesitar, por ejemplo, tienes que preguntar al usuario cuanto hueco quiere, por ejemplo para manejar un array, una matriz, una lista de estructuras, un dibujo...  Entonces tendrás que preguntar al usuario por el tamaño y luego reservarlo durante la ejecución, para hacer esto se usa la función malloc() en C y new() en C++.
Un ejemplo, vamos a crear un vector, le vamos a pedir al usuario que nos diga el número de elementos que tendrá el vector y luego le pediremos que lo rellene:
Código: Text
  1.  
  2. void main()
  3. {
  4. int n_elementos,i;
  5. float *vector; //puntero que apuntará al vector
  6.  
  7. printf("\n\tNumero de elementos del vector? ");
  8. scanf("%d",&n_elementos);
  9.  
  10. vector=(float*)malloc(sizeof(float)*n_elementos);//reservamos espacio para tantos floats como el usario quiera
  11.  
  12. for(i=0;i<n_elementos;i++)
  13. {
  14. printf("\n\tIntroduce valor %d: ",i+1);
  15. scanf("%f",&vector[i]);
  16. }
  17. ...
  18. ...
  19. }
  20.  
  21.  
De esta manera podríamos tratar con vectores dinámicos...  Sino nuestro programa sólo podría manejar vectores de un tamaño fijo: float vector[n];

Espero que te haya servido la explicación,
un saludo  :lightsabre:
No hay tonto más molesto que el ingenioso.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #3 en: Lunes 13 de Junio de 2005, 21:32 »
0
Esto va para 32 bits:

1.- En realidad todos los bloques de memoria sean "estáticos" o "dinámicos" trabajan de la misma forma para la computadora. Las diferencias las hace el compilador. La ventaja de lo "estático" es que tienes al compilador que te hecha una mano avisándote cuanto estás saliendo de los límites y se encarga de otros detalles más que tendrías que hacerlo por tu cuenta como liberar y reservar memoria.

2.- Recuerda que trabajas con TODA la memoria de la computadora en su totalidad, como si fuera un arreglo gigante y totalmente estático de bytes, así que escribes y lees de la posición que indiques para bien o para mal.

3.- Una referencia a memoria ("puntero") es un simple número en 32 bits que indica la posición donde quieres escribir o quieres leer.

4.- Naturalmente tienes que indicar si quieres leer/escribir 1,2 o 4 bytes por que la máquina no supone ni adivina nada. Para eso esta el type casting: para indicar cuanto quieres leer/escribir.

5.- Hasta ahora todo es simple, pero esto tiene que estar organizado, sincronizado o se convierte en un total desastre por que todos los programas que corren en la máquina meten mano a la memoria del sistema. Asi que aparece el lio de "reservar" y "liberar" memoria.

7.- "Reservar memoria": con esto indicas que pedazo de la memoria (ese gigantesco arreglo estático) utilizará tu programa. Es lógico que indiques desde que parte a que parte de la memoria quieres "reservarla" para que no la modifiquen, ni la lean.

Si no RESERVAS MEMORIA, los otros programas NO TENDRÁN FORMA de saber que parte de la memoria estás usando, asi que probablemente escribirán y modificarán y quien sabe que cosas harán con ese pedazo de memoria que se te ocurrio utilizar.

8.- "Liberar memoria": cuando no necesites usar más el pedazo de memoria que "reservaste", si no lo "liberas", los otros programas NO TENDRAN FORMA de saber que efectivamente ese pedazo de memoria ya no está siendo utilizado. Así que eventualmente no quedará pedazo de memoria que se pueda "reservar" y en el resto de los programas saltarán los errores de "no pude reservar, falta memoria" y por mecanismos de memoria virtual el disco duro empezará a trabajar en exceso.

9.- Como ya te darás cuenta al reservar memoria NO impides que esa parte de la memoria pueda ser modificada o leida por otros programas, ¿Te imaginas lo lento que sería hacer el control de que programa es propietario de que pedazo de memoria cada vez que tengas que leer o escribir en la memoria? Así que tienes que ser cuidadoso de no pasarte al escribir o leer  de "tu parte" de memoria que reservaste.

10.- Un programador tiene que estar conciente que las operaciones de reservar y liberar memoria son pesadas y deben evitarse en bucles que se quieran optimizar. Existen muchas técnicas para evitar reservar y liberar unos cuantos bytes de memoria todo el tiempo y hacerlo en bloques más grandes (1kb para arriba)

11.- Reservar y liberar bloques de memoria tan chicos como 1, 2 o 4 bytes es una gran forma de fragmentar la memoria y hacer más lenta una aplicación.

12.- Reservar bloques gigantes de memoria (actualmente 4MB para arriba*) es una buena forma de hacer trabajar al disco duro en exceso haciendo malabarismos con la memoria virtual para mantener ese gigantesco bloque de memoria en RAM. Esto último generalmente sucede con las imágenes pesadas (>1MB), es mejor trabajar con pedazos de memoria para cada línea de la imagen y no uno gigantesco para toda la imagen.

* Esto es fácil de percibir al programar una aplicación que trabaja con imágenes alojadas en un gran y único pedazo de memoria.

ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #4 en: Lunes 13 de Junio de 2005, 21:47 »
0
Por decirte algo ,, si quiero que en un archivo que tiene registros los cuales se van a ir incrementando con forme a las veces que quiera el usuario llenar, esos registros hay que declararlos uno por uno para que se vayan a memoria, o como le hago , pero tambien tengo un archivo , o si se trabaja archivos no es necesario usar la memoria, o al revez, sera que me puedes ayudar en eso ???

 :D
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



ElNapster

  • Moderador
  • ******
  • Mensajes: 727
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #5 en: Lunes 13 de Junio de 2005, 23:37 »
0
No le estoy entendiendo mucho a este tema porque segun el ejeplo que nos dieron hay como que una instrucccion "->" que la verdad no se par aque esy en los ejemplo que me enviaron no esta eso... sera que me podran aclarar esas dudas porfa,, o un ejmplito mas sencillo pero que se entienda con c++..

Gracias  :kicking:
"Somos lo que imaginamos ser"
-- --------------------------------------------------------------
-ElNapster
-Designer / Developer Software
-GuaTemALa



pitukilloloco

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Memoria Dinamica
« Respuesta #6 en: Martes 14 de Junio de 2005, 07:10 »
0
Cuando defines una estructura o una clase si estás programando en C++ (o una unión pera estas ya casi no se usan) usas al punto '.' para referenciar un campo de esta cuando tienes una variable de ese tipo. Pero si haces que una variable apunte a una estructura, clase o unión, entonces usas al guión seguido del símbolo mayor que -> para referenciar a los campos. Te muestro un ejemplo sencillo donde también uso memoria dinámica.
Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. struct alumno {
  7.   char nombre[80];
  8.   int matricula;
  9. };
  10.  
  11. int main ()
  12. {
  13.   struct alumno a, *pa;
  14.  
  15.   strcpy (a.nombre, "El Napster");
  16.   a.matricula = 1;
  17.  
  18.   pa = (struct alumno *)malloc (sizeof (struct alumno));
  19.   if (pa == NULL) {
  20.     fprintf (stderr, "\nMemoria Insuficiente!!!\n");
  21.     exit (EXIT_FAILURE);
  22.   }
  23.   strcpy (pa->nombre, "Otro alumno");
  24.   pa->matricula = 2;
  25.  
  26.   printf ("alumno: %s,\tmatricula: %d\n", a.nombre, a.matricula);
  27.   printf ("alumno: %s,\tmatricula: %d\n", pa->nombre, pa->matricula);
  28.  
  29.   free (pa);
  30.   return EXIT_SUCCESS;
  31. }
  32.  

jodijo5

  • Miembro HIPER activo
  • ****
  • Mensajes: 518
  • Nacionalidad: pe
    • Ver Perfil
    • http://www.bluetecnologia.com
Re: Memoria Dinamica
« Respuesta #7 en: Miércoles 15 de Junio de 2005, 19:30 »
0
mi amigo, te recomiendo un tutorial, sobre c++ desde 0, donde aprendes todo lo referente a este lenguaje:

cplusplus

pero aqui tambien hay una discucion sobre esto:

memoria dinamica
=============================
Daniel Pomalaza Mendoza
visita el Dinosaurio Azul :-D
http://bluetecnologia.com