Pila: La pila se usa como una especie de almohadilla temporal para el bloque de código que se está ejecutando actualmente, y cualquier bloque llamado actual, y cualquier bloque llamado ese, y así sucesivamente. Cuando sale el bloque actual, se olvidan las variables locales que estaba usando. Como su nombre indica, la pila se usa de la última en entrar, primero en salir.
Uno de los usos más importantes de la pila es realizar un seguimiento de la cadena de llamadas actual. Cuando una función llama a otra, la persona que llama empuja la dirección de la siguiente instrucción (la dirección de retorno) a la pila. A medida que cada función sale, aparece la dirección de retorno de la persona que llama fuera de la pila y continúa ejecutando el código comenzando en esa dirección. También se usa para comunicar parámetros de funciones y valores de retorno entre el que llama y el que recibe la llamada.
Montón: El montón es diferente, no tiene un orden particular. Si desea asignar memoria en un bloque de código y hacer que esa memoria permanezca más allá del final del bloque, la asigna al montón. Por supuesto, también necesitará almacenar un puntero/referencia en algún lugar para que otro código pueda encontrar esa memoria; la mayoría de los idiomas proporcionan alojamiento que.
Velocidad: Las diferencias de velocidad no se deben a ninguna propiedad de la memoria en sí misma, como dices en tu pregunta, tanto la pila como el montón suelen habitar en la misma memoria física. Asignar espacio en la pila es rápido debido a la naturaleza LIFO de las pilas: si empujas algo sobre la pila, solo hay un lugar donde puede terminar. Por el contrario, la asignación de un bloque en el montón requiere encontrar una región libre contigua lo suficientemente grande en la memoria. Una asignación de pila puede ser tan rápida como una sola instrucción; una asignación de montón requiere una llamada a una función de asignación de memoria como malloc()
.
Static v. Dynamic: La asignación de memoria en el montón es dinámica: si se asigna un bloque y el tamaño del bloque, se puede determinar según la entrada que el programa recibe mientras se está ejecutando. Las regiones de memoria asignadas en el montón pueden incluso cambiarse de tamaño si es necesario. Es posible para asignar dinámicamente memoria en la pila, también (consulte la función de biblioteca estándar C alloca()
), pero esa memoria se perderá tan pronto como salga la función actual. Las asignaciones de pila generalmente son estáticas: el compilador determina cuánto espacio se necesita para los parámetros (sin registro), los datos de retorno y las variables locales, y genera código para reservar el espacio necesario en la pila cuando se llama a la función.
Ejemplo: Imagine que está creando un procesador de texto. No puede saber con anticipación qué tan grande será el documento, ni cuántos documentos se usarán al mismo tiempo. Al mismo tiempo, desea que los documentos del usuario permanezcan en la memoria siempre que el usuario quiera mantenerlos abiertos. Si intenta asignar memoria para los documentos en la pila, le resultará difícil tener más de uno abierto a la vez, y deberá crear una sola función que cree, edite, guarde y cierre el documento. Asignar el espacio en el montón le permite crear tantos documentos como desee, cada uno de los cuales tiene el tamaño adecuado para los datos que contiene, y para evitar vincular el tiempo de vida de los documentos con el tiempo de vida de una función en particular.
Resumen: En pocas palabras, la pila contiene los valores de las variables (a veces se usan registros en su lugar), mientras que el montón se utiliza para asignar memoria que se utilizará más allá del tiempo de vigencia del bloque actual.
http://stackoverflow.com/questions/7123936/why-is-there-a-stack-and-a-heap – drdwilcox
http://stackoverflow.com/questions/79923/what-and-where-are -the-stack-and-heap –