Heap vs stack
Montón vs pila
P: ¿Dónde se asignan los objetos en C#?
En C# hay dos lugares donde se puede almacenar un objeto: el montón y la pila.
Los objetos asignados en la pila están disponibles solo dentro de un marco de pila (ejecución de un método), mientras que se puede acceder a los objetos asignados en el montón desde cualquier lugar.
P: ¿Qué objetos se asignan en la pila y qué objetos se asignan en el montón?
Nota: nunca debe decir "los tipos de referencia se asignan en el montón mientras que los tipos de valor se asignan en la pila", este es un error que se repite comúnmente y activa una señal de alerta para un entrevistador experimentado.
Los tipos de referencia (clases, interfaces, delegados) siempre se asignan en el montón.
Cuando pasas un objeto de referencia como parámetro o lo asignas a una variable, de hecho estás pasando su referencia. La referencia (no el objeto referenciado) se puede asignar tanto en la pila como en el montón.
Al pasar una referencia a un objeto, estás indicando dónde se encuentra ese objeto en el montón para que tu código pueda acceder a él.
Cada vez que se pasa un objeto como referencia, se copia la referencia misma. Esto significa que puede cambiar la referencia para que apunte a un objeto diferente sin afectar el objeto anterior ni otras referencias que apunten a él. Una referencia es liviana y siempre tiene un tamaño constante (32 bits o 64 bits dependiendo del bitness del sistema operativo), por lo que copiarla (y, por lo tanto, transmitir tipos de referencia) se considera económico.
Los tipos de valor (derived from System.ValueType, e.g. int, bool, char, enum and any struct) (derivados de System.ValueType, por ejemplo, int, bool, char, enum y cualquier estructura) se pueden asignar en el montón o en la pila, dependiendo de dónde se declararon.
Si el tipo de valor se declaró como una variable dentro de un método, entonces se almacena en la pila.
Si el tipo de valor se declaró como parámetro de método, entonces se almacena en la pila.
Si el tipo de valor se declaró como miembro de una clase, entonces se almacena en el montón, junto con su padre.
Si el tipo de valor se declaró como miembro de una estructura, entonces se almacena dondequiera que se almacene esa estructura.
A partir de C#7.2, una estructura(struct) se puede declarar como estructura ref(ref struct), en cuyo caso siempre se asignará en la pila, evitando que se declare dentro de tipos de referencia.
Las instancias de tipos de valor se pasan mediante copia (a menos que se utilicen con semántica de referencia, ver más abajo). Esto significa que cada vez que se asigna un tipo de valor a una variable o se pasa como parámetro, el valor se copia.
Debido a que copiar tipos de valores puede resultar costoso según el tamaño del objeto, no se recomienda declarar objetos con mucha memoria como tipos de valores.
Dado que cada tipo en C# deriva de System.Object, los tipos de valor se pueden asignar a variables o pasar a métodos que esperan un objeto. En tales casos, el valor se copia y almacena en el montón empaquetado como un tipo de referencia, en una operación conocida como boxeo.
https://dev.to/tyrrrz/interview-question-heap-vs-stack-c-5aae#:~:text=Q%3A%20Where%20are%20objects%20allocated%20in%20C%23%3F&text=Objects%20allocated%20on%20the%20stack,can%20be%20accessed%20from%20anywhere.
Si el contenido le ha sido de utilidad, lo invitamos a hacer una donación en el siguiente botón.La cantidad que sea de su voluntad entregarEn caso que no se visualice el contenido, hacer recargar (refresh) a la página que sea abierta. |
No hay comentarios:
Publicar un comentario