En breve
Se utiliza una pila para la asignación de memoria estática y un montón para la asignación de memoria dinámica, ambos almacenados en la RAM de la computadora.
En detalle
La pila
La pila es una estructura de datos "LIFO" (último en entrar, primero en salir), que es administrada y optimizada por la CPU bastante de cerca. Cada vez que una función declara una nueva variable, se "inserta" en la pila. Luego, cada vez que sale una función, todas las variables empujadas a la pila por esa función se liberan (es decir, se eliminan). Una vez que se libera una variable de pila, esa región de memoria queda disponible para otras variables de pila.
La ventaja de usar la pila para almacenar variables es que la memoria se administra por usted. No tiene que asignar memoria a mano o liberarla una vez que ya no la necesita. Además, debido a que la CPU organiza la memoria de la pila de manera tan eficiente, leer y escribir en las variables de la pila es muy rápido.
Más se puede encontrar aquí .
El montón
El almacenamiento dinámico es una región de la memoria de su computadora que no se administra automáticamente para usted y que la CPU no lo hace de manera tan estricta. Es una región de memoria más flotante (y es más grande). Para asignar memoria en el montón, debe usar malloc () o calloc (), que son funciones integradas de C. Una vez que haya asignado memoria en el montón, usted es responsable de usar free () para desasignar esa memoria una vez que ya no la necesite.
Si no lo hace, su programa tendrá lo que se conoce como pérdida de memoria. Es decir, la memoria en el montón aún se reservará (y no estará disponible para otros procesos). Como veremos en la sección de depuración, hay una herramienta llamada Valgrind que puede ayudarlo a detectar pérdidas de memoria.
A diferencia de la pila, el montón no tiene restricciones de tamaño en tamaño variable (aparte de las limitaciones físicas obvias de su computadora). La memoria de almacenamiento dinámico es un poco más lenta de leer y escribir, porque uno tiene que usar punteros para acceder a la memoria en el almacenamiento dinámico. Hablaremos de punteros en breve.
A diferencia de la pila, las variables creadas en el montón son accesibles por cualquier función, en cualquier parte de su programa. Las variables de montón son esencialmente de alcance global.
Más se puede encontrar aquí .
Las variables asignadas en la pila se almacenan directamente en la memoria y el acceso a esta memoria es muy rápido, y su asignación se trata cuando se compila el programa. Cuando una función o un método llama a otra función que a su vez llama a otra función, etc., la ejecución de todas esas funciones permanece suspendida hasta que la última función devuelva su valor. La pila siempre está reservada en un orden LIFO, el bloque reservado más recientemente es siempre el siguiente bloque que se liberará. Esto hace que sea realmente simple hacer un seguimiento de la pila, liberar un bloque de la pila no es más que ajustar un puntero.
Las variables asignadas en el montón tienen su memoria asignada en tiempo de ejecución y el acceso a esta memoria es un poco más lento, pero el tamaño del montón solo está limitado por el tamaño de la memoria virtual. Los elementos del montón no tienen dependencias entre sí y siempre se puede acceder de forma aleatoria en cualquier momento. Puede asignar un bloque en cualquier momento y liberarlo en cualquier momento. Esto hace que sea mucho más complejo hacer un seguimiento de qué partes del montón están asignadas o libres en un momento dado.
Puede usar la pila si sabe exactamente cuántos datos necesita asignar antes del tiempo de compilación, y no es demasiado grande. Puede usar el montón si no sabe exactamente cuántos datos necesitará en tiempo de ejecución o si necesita asignar una gran cantidad de datos.
En una situación de subprocesos múltiples, cada subproceso tendrá su propia pila completamente independiente, pero compartirán el montón. La pila es específica de subproceso y el montón es específico de la aplicación. Es importante tener en cuenta la pila en el manejo de excepciones y las ejecuciones de subprocesos.
Cada subproceso obtiene una pila, mientras que normalmente solo hay un montón para la aplicación (aunque no es raro tener varios montones para diferentes tipos de asignación).
En tiempo de ejecución, si la aplicación necesita más almacenamiento dinámico, puede asignar memoria de la memoria libre y si la pila necesita memoria, puede asignar memoria de la memoria asignada de memoria libre para la aplicación.
Incluso, se dan más detalles aquí y aquí .
Ahora ve a las respuestas de tu pregunta .
¿En qué medida están controlados por el sistema operativo o el tiempo de ejecución del lenguaje?
El sistema operativo asigna la pila para cada subproceso de nivel de sistema cuando se crea el subproceso. Normalmente, el tiempo de ejecución del lenguaje llama al sistema operativo para asignar el montón para la aplicación.
Más se puede encontrar aquí .
¿Cuál es su alcance?
Ya dado en la parte superior.
"Puede usar la pila si sabe exactamente cuántos datos necesita asignar antes del tiempo de compilación, y no es demasiado grande. Puede usar el montón si no sabe exactamente cuántos datos necesitará en tiempo de ejecución o si necesita asignar muchos datos ".
Más se puede encontrar aquí .
¿Qué determina el tamaño de cada uno de ellos?
El sistema operativo establece el tamaño de la pila cuando se crea un subproceso. El tamaño del montón se establece en el inicio de la aplicación, pero puede crecer a medida que se necesita espacio (el asignador solicita más memoria del sistema operativo).
¿Qué lo hace a uno más rápido?
La asignación de la pila es mucho más rápida ya que todo lo que realmente hace es mover el puntero de la pila. Con los grupos de memoria, puede obtener un rendimiento comparable de la asignación de almacenamiento dinámico, pero eso viene con una ligera complejidad adicional y sus propios dolores de cabeza.
Además, stack vs. heap no es solo una consideración de rendimiento; También le informa mucho sobre la vida útil esperada de los objetos.
Los detalles se pueden encontrar desde aquí .