Saltar al contenido

Asignación de memoria: ¿pila vs montón?

Esta pregunta se puede resolver de diferentes maneras, pero nosotros te mostramos la que para nosotros es la respuesta más completa.

Solución:

Deberías considerar la cuestión de donde los objetos se asignan como un detalle de implementación. No le importa exactamente dónde se almacenan los bits de un objeto. Puede importar si un objeto es un tipo de referencia o un tipo de valor, pero no tiene que preocuparse por dónde se almacenará hasta que comience a optimizar el comportamiento de recolección de elementos no utilizados.

Si bien los tipos de referencia siempre se asignan en el montón en las implementaciones actuales, los tipos de valor puede ser asignados en la pila, pero no necesariamente. Un tipo de valor solo se asigna en la pila cuando es una variable local o temporal sin escape que no está incluida en un tipo de referencia y no está asignada en un registro.

  • Si un tipo de valor es parte de una clase (como en su ejemplo), terminará en el montón.
  • Si está en una caja, terminará en el montón.
  • si es en un arrayterminará en el montón.
  • si es un static variable, terminará en el montón.
  • Si es capturado por un cierre, terminará en el montón.
  • Si se usa en un bloque iterador o asíncrono, terminará en el montón.
  • Si se crea mediante un código no seguro o no administrado, podría asignarse en cualquier tipo de estructura de datos (no necesariamente una pila o un montón).

¿Hay algo que me perdí?

Por supuesto, sería negligente si no vinculara las publicaciones de Eric Lippert sobre el tema:

  • La pila es un detalle de implementación, primera parte
  • La pila es un detalle de implementación, segunda parte
  • Y quizás el mejor: La verdad sobre los tipos de valor

m se asigna en el montón, y eso incluye myInt. Las situaciones en las que se asignan tipos primitivos (y estructuras) en la pila es durante la invocación del método, que asigna espacio para las variables locales en la pila (porque es más rápido). Por ejemplo:

class MyClass

    int myInt = 0;

    string myString = "Something";

    void Foo(int x, int y) 
       int rv = x + y + myInt;
       myInt = 2^rv;
    

rv, x, y todos estarán en la pila. myInt está en algún lugar del montón (y se debe acceder a través del this puntero).

“Todos los tipos de VALUE se asignarán a la pila” es muy, muy incorrecto; variables de estructura puede viven en la pila, como variables de método. Sin embargo, los campos de un tipo vivir con ese tipo. Si el tipo de declaración de un campo es una clase, los valores están en el montón como parte de ese objeto. Si el tipo de declaración de un campo es una estructura, los campos son parte de esa estructura donde sea que estructura vidas.

Incluso las variables de método puede estar en el montón, si son capturado (lambda/anon-method), o parte de (por ejemplo) un bloque iterador.

Acuérdate de que puedes optar por la opción de esclarecer si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *