Inicio / Wikis / Apuntes / Estructura de Datos - Manejo de Memoria

Estructura de Datos - Manejo de Memoria

(3 opiniones)
Apuntes creado por Susana Davalos
28 de Septiembre de 2007
C Sharp

1 - Manejo de Memoria

Unidad II

Manejo de memoria













2.1 Manejo de memoria



Todas las variables, arreglos y objetos en general tienen una duración determinada durante el transcurso de un programa, esto quiere decir que son creados y destruidos de acuerdo a la ejecución del programa.



Existen 3 formas de utilizar la memoria para almacenar valores.



1.-Memoria Estática

Se utiliza para las variables globales y las declaradas como estáticas, tales objetos tienen asignada la misma dirección de memoria desde el comienzo hasta el final del programa.



* variables globales
* variables static



2.-Memoria Automática

Es la utilizada por los argumentos y las variables locales en una función o procedimiento, cada ejecución de este crea tales objetos y son destruidos al salir de ellos.



* argumentos
* variables locales



3.-Memoria Dinámica

Es también llamado almacenamiento libre y en estos caso el programador solicita memoria para almacenar un objeto y es el responsable de liberar tal memoria para que pueda ser reutilizada por otros objetos.





La operación de reservar y liberar memoria para variables globales estáticas o globales son realizadas de modo implícito por el programa, la única que realiza el programador directamente es la de reservar memoria de forma dinámica.



2.1.1 Manejo de memoria estática



Memoria estática:

Es la memoria que se reserva ene l momento de la compilación antes de comenzar a ejecutarse el programa. Los objetos mantienen la misma localización en memoria durante todo el transcurso del programa.



Los objetos administrados de este modo son variables globales, variables static de funciones y miembros static de clases y literales de cualquier tipo.



Ejemplo 2.1:



using

System;

using

System.Collections.Generic;

using

System.Text;

namespace

Ejemplo21

{

class CSimple

{

static void Main(string[] args)

{

int [] numeros=new int[] {1,2,3,4,5};

for (int i = 0; i < 5; i++)

Console.WriteLine("Numeros {0}= {1}",i+1, numeros[i]);

Console.ReadLine();



}

}

}



Nota: En el ejemplo 2.1 se muestra la declaración estática de un arreglo de números enteros y la de la variable i para controlar el ciclo for.



Ejemplo 2.2



using

System;

using

System.Collections.Generic;

using

System.Text;

namespace

Ejemplo22

{

class CSimple

{

static int Funcion(int p, int q)

{

return (p + q);

}



static void Main(string[] args)

{

int Resultado = Funcion(7, 2);

Console.WriteLine("El resultado es:{0}", Resultado);

Console.ReadLine();

}

}

}





Nota: En el ejemplo 2.2 se muestra la declaración estática de una función entera y de otra variable entera para guardar el resultado de la ejecución de la función.



El problema con la memoria estática de memoria es que siempre se reserva antes de conocer los datos concretos del problema y esto origina reservar siempre un máximo de memoria que en la mayoría de las veces no se va a necesitar.





2.1.2 Manejo de memoria dinámica





Memoria dinámica:

La reserva de memoria dinámica se hace en tiempo de ejecución después de leer los datos y de conocer el tamaño exacto del problema. Como consecuencia se adapta mucho mejor a las necesidades en cada caso.



El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como montículo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo de puntero utilizado. La creación y destrucción de los objetos esta en manos del programador a través de los operadores new y delete.



En C# las variables que se declaran son punteros y se pasan eficientemente con referencia, tampoco es necesario considerar la liberación de la memoria puesto que framework se encarga de liberar todas las referencias que no se estén utilizando y compactar la memoria para mejorar el rendimiento.



En C# las clases es el componente básico del lenguaje y siempre se almacenan en el heap.



Ejemplo de una clase



public class MyClase

{

public MyClase() Constructor default

{

sentencias;

}



public MyClase() destructor

{

sentencias;

}



MyClase mine=new MyClase(); instancia de la clase

}





Nota: En el ejemplo anterior MyClase es tratada sintacticamenente como una referencia y no como un puntero por lo tanto C# obliga a reservar la memoria dinámica para una instancia particular





Tipos de referencias en C#



* Object
* string
* todas las clases



Tipos valor en C#

* Tipos de predefinidos (int, flat....)
* Estructuras
* Enumeraciones



2.1.3 Ventajas de utilizar memoria dinámica vs memoria estática



La memoria dinámica sirve para que los programadores se adapten siempre al tamaño del problema que tienen que resolver sin desperdiciar recursos de memoria y esto se traduce en una mayor eficiencia en la ejecución de los programas, las ventajas de utilizar memoria dinámica se valoran mejor en comparación con la utilización de la reserva de la memoria estática, como se muestra en el siguiente cuadro.





Reserva Estática de memoria Reserva Dinámica de memoria

Creación del los Objetos



Los objetos locales son creados al entrar en la función que los declara.

Los globales son creados al iniciarse en programa.
La memoria se reserva explícitamente con el operador new.
Duración de los objetos

Los objetos locales se destruyen al salir de la función en que son creados. Los globales se destruyen al salir del programa.
Los objetos son destruidos explícitamente con el operador delete. (En c# la función la realiza el recolector de basura automáticamente).
Índice de los Arreglos

El valor del índice debe ser un valor constante

Ejemplo:

int A [20];



El valor de un arreglo puede ser un valor de una variable, de modo que la cantidad de memoria reservado puede variar en tiempo de ejecución.

Ejemplo:

int A = new int[variable];







Ejemplos Extras de la aplicación de memoria dinámica y estática.





Ejemplo Aplicacián Estática

using

System;

using

System.Collections.Generic;

using

System.Text;

namespace

MyEjemploEstatica

{



public

class Empleado

{



public string id;



public string nombre;



public Empleado ()

{

}



public Empleado(string nombre, string id)

{



this.nombre = nombre;



this.id = id;

}



public static int ContadorEmpleado;





Aplicacion de memoria estatica



public static int AgregarEmpleado()

{



return ++ContadorEmpleado;

}

}



class MainClass : Empleado

{



public static void Main()

{



Console.Write("Ingresa el nombre del empleado: ");



string nombre = Console.ReadLine();



Console.Write("Ingresa el Id del empleado: ");



string id = Console.ReadLine();



Creando el objeto empleado:

Empleado e =

new Empleado(nombre, id);



Console.Write("Ingresa el No. de empleados: ");



string n = Console.ReadLine();

Empleado.ContadorEmpleado =

Int32.Parse(n);

Empleado.AgregarEmpleado();



Nueva informacion:



Console.WriteLine("Nombre: {0}", e.nombre);



Console.WriteLine("ID: {0}", e.id);



Console.WriteLine("Nuevo No. de empleados: {0}", Empleado.ContadorEmpleado);



Console.ReadLine();

}

}

}





Ejemplo Aplicacián Dinámica





using

System;

using

System.Collections.Generic;

using

System.Text;

namespace

MyEjeDinamica

{



public class Persona

{



public string nombre;



constructor



public Persona()

{

nombre =

"Desconocido";

}



metodo



public void leerNombre(string nom)

{

nombre = nom;

}

}



class Program

{



static void Main(string[] args)

{

Persona persona1 =

new Persona();

System.

Console.WriteLine(persona1.nombre);

persona1.leerNombre(

"Susana Davalos");

System.

Console.WriteLine(persona1.nombre);

persona1.leerNombre(

"Gisela Rios");

System.

Console.WriteLine(persona1.nombre);

persona1.leerNombre(

"Argelia Corona");

System.

Console.WriteLine(persona1.nombre);



Console.ReadLine();

}

}

}


esta publicado en publicado tambien google por mi
Valora este capítulo: (3 opiniones)
Autor y licencia de 'Estructura de Datos - Manejo de Memoria'

Opiniona sobre 'Estructura de Datos - Manejo de Memoria' (3)

Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.

Opina sobre este apuntes



* Valoración:
* Nombre:
* Correo electrónico:
* Título:
* Comentario:

Wikis relacionados con 'Estructura de Datos - Manejo de Memoria'

Apuntes relacionados con la materia de Estructura de Datos en el area de la programacion.
Un sistema informático utiliza ordenadores para almacenar datos, procesarlos y ponerlos a disposición de quien... Más »
Por medio de la interpretación de los datos presentados en los estados financieros los administradores,... Más »
El Poeta posee la extraña capacidad para hablar sobre los orígenes. Digo "extraña" porque no... Más »
En la actualidad, no existe un formato común generalmente aceptado para los datos contenidos en... Más »
¿Estás seguro de que deseas eliminar este capítulo?