Está en la página 1de 33

Memoria

able-Parmetro
Los LP tienen forma de expresar directamente algunos valores, hay valores que son resultados de un cmputo o de un proceso de creacin. Cmo se guardan los valores para ser usados posteriormente? O los valores deben computarse en el momento en que se usen? Variable es una Zona de memoria que almacena un valor (y que pudiera cambiarse). Se maneja y se cambia explcita o implcitamente. Ms imperativo o ms declarativo.

true false

Por Valor
Variables locales al mtodo Main Ambito: dnde se pueden usar 2
k

2
j

Zona de memoria de las variables del mtodo Main

Al ejecutar k++ cambia la memoria de k pero no la de j 3


k

2
j

Zona de memoria de las variables del mtodo Main

r Referencia

true true

r Referencia

2
k

2
j

fes nav tiv ida o d Zona de memoria de las variables del mtodo Main

26 25 D

12 M

201 3 A

25 D

12 M

201 3 A

new Fecha(25,12,2013)

Zona de memoria Heap

Despues de hacer festivo.D = 26

cha por Valor

true

false

r Referencia

25 D

12 M navidad

201 3 A

25 26 D

201 12 3 M A festivo

Despues de hacer festivo.D = 26

Zona de memoria de las variables del mtodo Main

partir o Duplicar Objetos?


class Persona{ string nombre; Fecha fechaNac; ... } class int int int ... } Fecha{ D; M; A; class Libro{ string titulo; Persona autor; ... }

Cmo representar dos libros escritos por un mismo autor? Cmo representar dos autores que nacieron el mismo da?

partir o Duplicar Objetos?


Comparten un mismo autor objeto Persona
titulo libro1 autor D fechaNacM titulo libro2 autor D otroAutor M Cien aos de soledad nombre
20 12

Gabriel Garca Mrquez

A 1933 nombre
20 12

Crnica de una muerte anunciada Juan No comparten la fecha aunque son iguales en este caso

A 1933

partir o Duplicar Objetos?


class Persona{ string nombre; Fecha fechaNac; ... } struct class Libro{ Fecha{ string titulo; int D; Persona autor; int M; ... int A; } ... } Fecha o se quiere tratar por referencia y se define como class o se quiere tratar por valor y se define como struct. Si queremos en ciertos casos tratarlo por referencia y en otro tratarlo por valor tendramos que definir una class y otro struct que en esencia son iguales

Si queremos en ciertos casos tratarlo por referencia y en otro tratarlo por valor tendramos que definir un class y otro similar definirlo struct

nded en el lenguaje Eiffel


class int int int ... } Fecha{ D; M; A; class Libro{ string titulo; Persona autor; ... }

class Persona{ string nombre;

expanded
... }

Fecha fechaNac;

void F( expanded Fecha f, Persona p)

ing y Unboxing
Los tipos por valor pueden ser tratados por int referencia i = 123; i 123
object x = i;
x
System.Int3 2

123

Boxing

int j = (int) x;
j

123

Unboxing

ing y Unboxing

CP Cuales son los pasos que estan por detras para que de este resultado?

ing y Unboxing
object y = navidad;
25 D 12 M navidad Zona de memoria de las variables del mtodo Main 201 3 A

Los tipos por valor pueden ser tratados por referencia

FechaStruct navidad = new FechaStruct(25, 12, 2013);

25 D

12 M

201 3 A

Boxing de FechaStruct Heap

mbito (scope)

Desde qu partes del cdigo se tiene acceso a una determinada entidad (variable, parmetro, mtodo) Por lo general est determinado por una declaracin textual (dentro de un mtodo, dentro de una clase) que indica su alcance o mbito (partes del texto del cdigo que la pueden acceder y/o manipular)

mbito (scop

3 1 0 10 3 10 0 1 5

1000

empo de Vida

Cunto dura la asociacin de un binding (por ejemplo el espacio asignado a una variable?)
Toda la ejecucin de la aplicacin (variables estticas desde su carga en C#, variables globales en Pascal) La ejecucin de un mtodo, funcin (parmetros y variables locales en C#) Dependiendo del "objeto", "funcin" a la que est asociada

Ventajas y desventajas de la destruccin explcita


Uso ms sintonizado por el programador de la memoria Destruccin anticipada implica referencias al limbo El dispose en C++ vs el dispose en C# (Seminarios de C++ )

Recoleccin automtica de basura


Puede sintonizarse y forzarse en la ejecucin Estrategias (Seminario)

empo de Vida
Cunto dura el cdigo de un mtodo de instancia de una clase en C#? class A{ int x; ... void F(...){ ... } } void M(...){ A a = new A(); ... a.F(...); ... }

El tiempo de vida de la x de la variable a es el de la ejecucin del mtodo M durante cuya ejecucin se cre un objeto de tipo A , el tiempo de vida del cdigo del mtodo F puede ser el de toda la ejecucin

Vida y Organizacin de la Memoria t4


class A { static T1 t1; T2 t2; string s; ... T3 F(T4 y) { T5 t5; T4 t4; ... F(t4); ... } } class Program{ static T6 t6; static void Main(){ A a = new A(); T4 x = new T4();
RA de llamada recursiva a F RA de F t5 y PILA t4 t5 y x RA de Main a t6 los estticos t1

T2
string

T4

HEAP

puntadores
Las referencias hay que crearlas explcitamente (C++), by default la semntica es por valor
Fecha f; ... f.D = 31; f.M = 12; f.A = 2013; Fecha otraFecha = f; Fecha *f1 = new Fecha; Se copia n los valores de f hacia otraFecha Se separa una zona de memoria para una Fecha y el apuntador se pone en f1

f1->D = 25 f1->M = 12; f2->A = 2013; Se refiere a la zona de memoria apuntada por f1 f1 = &f; f1 apunta a la memoria de f

puntadores
Los objetos se destruyen explcitamente y la memoria de los mismos se libera explcitamente
class Fecha { ... ~ Fecha(){ } }

Mtodo destructor de Fecha

Fecha *f1 = new Fecha; delete f1; Se aplica el destructor de Fecha (si lo hubiese) y se libera la memoria ocupada por lo apuntado por f1

untadores al limbo
Fecha *f1 = new Fecha(); f1->D = 31; f1->M=12; f1->A = 2013; Fecha *f2 = f1; f1 f2
31 12 2013

delete f1; f1 f2 La memoria de lo apuntado por f1 queda disponible para ser reusada por el sistema

31 12 2013

En C#
Fecha f1 = new Fecha(); F1.D = 31; f1.M=12; f1.A = 2013; Fecha f2 = f1; f1 f2 delete f1; f1 = null; f1 f2 nul l
31 12 2013 31 12 2013

La memoria de lo referenciado por f2 El framework lleva el control con un Garbage Colletor

n y Traspaso de Parmetros
La forma en que fsicamente se pasan
Por copia (by copy) (el implcito en C, Pascal, Java, Eiffel, C++, C#) Por referencia (by reference, by sharing) (FORTRAN, C++ con &, var en Pascal, ref y out en C#) Por nombre (perezoso) (by name) (ALGOL)

so de Parmetros . . . Por Copia


Los parmetros formales hacen de variables locales (tienen su propio espacio en la pila segn el modelo de ejecucin y el tipo). Modo in (by value) es el implcito en C# Se evala el parmetro real y se hace una copia del parmetro real sobre el parmetro formal (una referencia, una estructura o valor simple en caso C#). Una asignacin al parmetro formal no afecta al parmetro real de quien hizo el llamado (en C# puede tener por detrs un boxing).

so de Parmetros . . . Por Copia


Modo por resultado (by result) No se pasa copia del parmetro real al parmetro formal al hacer la llamada. El parmetro formal se usa como variable local y primero debe usarse por parte izquierda. El valor que se encuentre en ste se copiar sobre el parmetro real al retornar Ejemplo out Ada No existe en C#
Qu pasa si hubiramos hecho?

so de Parmetros . . . Por Copia


Modo por valor-resultado (by value-result) Mezcla de ambos. Se copia el valor del parmetro real al parmetro formal al empezar y luego al retornar se copia el valor del parmetro formal hacia el parmetro real Ejemplo in-out en Ada No existe en C#

so de Parmetros . . .
Quien llama pasa la direccin del parmetro real hacia el parmetro formal. Dentro del mtodo una referencia al parmetro formal se trata como una referencia al parmetro real (va alguna forma de direccionado indirecto) Un cambio sobre el parmetro formal afecta directamente al parmetro real Ejemplo FORTRAN, Qu pasavar si elde Pascal, & de C++, ref y out
parmetro formal es en C# una expresin que calcula un valor?

or Referencia

so de Parmetros . . .
static void f(ref int i) begin i++; end ... int k=2; f(ref k); System.Console.WriteLine(k);

Por Referencia (C#)

El programador tiene que estar consciente de lo que quiere k tiene que estar inicializado

Lo que se escribe es 3

paso de Parmetros . . .

Referencia (Caso C#)


static void p(out int j){ //... j=2; //... } ... int k; f(out k); System.Console.WriteLine(k);

Todos los caminos de retorno deben garantizar asignar un valor a j

El que llama tiene que estar claro de lo que quiere k NO tiene que estar inicializado

Lo que se escribe es 2

Es lo mismo por referencia que por valorresultado?

aso de Parmetros . . . Ver cmo es en el seminario de Arrays FORTRAN


Por copia con el mismo tamao parmetro real y formal (Pascal) Por copia copiando la referencia pero no los elementos (Java, C#, Eiffel) Si cambiamos elementos del array los cambiamos en el parmetro real. Si asignamos un nuevo array al parmetro formal se mantiene la conexin entre parmetro real y el array que tena Por referencia (Pascal con var, C# con ref) Si asignamos un nuevo array al parmetro formal se desconecta la asociacin que haba entre

aso de Parmetros . . .
Cmo expresar cantidad cualquiera de parmetros? params en C# Los parmetros reales tienen que ser del mismo tipo y se pasan como un array F(int j, params T[] x){ } F(3, a, b, c); a, b y c que deben ser de tipo T se pasan como un array, como si se hubiese hecho F(3, new T[]{a,b,c})

Pensar una mejor semntica para ICloneable y struct

También podría gustarte