Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





c# Consumo de recursos variable local

Iniciado por Totemalf, 11 de Julio de 2012, 10:31:58 PM

« anterior - próximo »

Totemalf

voy a preguntar seguramente una tontería, pero allá va:
por lo que entiendo hasta el momento la diferencia entre un atributo de una clase y una variable local en un método, es que el atributo se puede usar en cualquier método de esa clase y la variable local únicamente en el método que reside. Esto me plantea la siguiente duda... ¿por qué no declarar esas variables locales como atributos? ¿ y si es una clase extensa y luego se me ocurre que tengo que usar esa variable local en otro método? obviamente son nimiedades, ya que en el momento que la necesitase la declaro como atributo, o en todo caso, si he creado mi diagrama de flujo en condiciones se donde se deberá usar cada variable.... pero es simple curiosidad. Un atributo y una variable local del mismo tipo, por ejemplo Int32 ¿consumen la misma memoria, o si es atributo consume más? (ahora es cuando os reís)

Un saludo y gracias!

[EX3]

Cita de: Totemalf en 11 de Julio de 2012, 10:31:58 PM
Un atributo y una variable local del mismo tipo, por ejemplo Int32 ¿consumen la misma memoria, o si es atributo consume más? (ahora es cuando os reís)
Supongo que te referiras a una variable publica y una privada. Sea como sea ambas ocuparian la misma memoria.

Y risas ninguna, coñe, que si no se pregunta no se aprende en esta vida ;)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

blau

La diferencia entre declararla en el ámbito de clase o en el ámbito del método, es que:

   1) Cuando se declara en el método se reserva memoria en el área de pila asociada a la llamada al método, de forma que cuando se sale del método esta variable desaparece.

   2) Cuando se declara en el cuerpo de una clase, se reserva memoria en el heap o memoria dinámica, cuando se instancia un objeto de la clase.

Ahora bien, declarar variables en el cuerpo de la clase que sólo van a ser usadas internamente en el ámbito de un método, pensando que reusas memoria, te va a traer más problemas que beneficios... imagina que tienes una variable para recorrer bucles... llamas a un método que la usa, y éste a su vez llama a otro método de la clase que la vuelve a usar.... la acabas de liar parda....

Deberías usar variables de clase sólamente cuando tenga sentido... si tienes variables que sólo vas a usar en el ámbito de un método no las saques de ese ámbito.... ;)


Vicente

Cuantos menos atributos tenga una clase mejor, porque mas facil es de usar. Como te dediques a promocionar variables locales a atributos en vez de pasarlas como parametros a metodos, estas haciendo la clase mas complicada de entender. Blau te ha puesto un ejemplo muy bueno de un problema que puedes tener si haces eso.

Siguiendo esta idea de no promocionar variables a atributos, una idea es por ejemplo que los metodos privados de una clase que no modifiquen el estado de la clase, marcarlos como estaticos, asi sabes con certeza que ese metodo solo calcula algo, pero que el objeto no se modifica.

Un saludo!

Vicente

Manu343726

Solo una pequeña anotación:

En los lenguajes imperativos, tales como C/C++, las variables locales de una función se guardan en el marco de pila de dicha función; de manera que éstas tienen el mismo tiempo de vida que la ejecución de la función. Normalmente los marcos de pila de la aplicación tienen una tamaño limitado, de 1.5MB aproximadamente, dependiendo de la configuración del compilador. Ésto puede dar problemas a la hora de declarar variables locales muy grandes, como por ejemplo una array de un millón de elementos, ya que sobrepasas el tamaño máximo del marco de pila.

En lenguajes totalmente OOP, tales como Java o C#, ésto nunca te va a pasar, ya que tus variables en realidad son punteros a los objetos que te refieres, éstos últimos alojados en memoria dinámica. De manera que en C# por ejemplo, no tienes ningún problema en declarar una array de un millón de elementos en una función, ya que el puntero al array únicamente ocupa 32 o 64 bits.

PD: Por supuesto, el ejemplo que he dado es meramente ilustrativo, si que puedes llegar a tener problemas, pero se ve claramente que el límite de memoria del heap de la aplicación es bastante mayor que los 1.5MB del stackframe de la función.

blau

Cita de: Manu343726 en 12 de Julio de 2012, 01:28:46 PM

En lenguajes totalmente OOP, tales como Java o C#, ésto nunca te va a pasar, ya que tus variables en realidad son punteros a los objetos que te refieres, éstos últimos alojados en memoria dinámica. De manera que en C# por ejemplo, no tienes ningún problema en declarar una array de un millón de elementos en una función, ya que el puntero al array únicamente ocupa 32 o 64 bits.

En C# tienes tipos por valor que se guardan en la pila... digase structs, int, float,enums,.... etc... ;)

Manu343726

claro claro, me referia a objetos en general, no a los tipos basicos xddd

Totemalf







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.