c++ - new - Stack Memory vs Heap Memory
dynamic memory c++ new (3)
Posible duplicado:
Qué y dónde están la pila y el montón
Estoy programando en C ++ y siempre me pregunto qué es exactamente la memoria de pila frente a la memoria de montón. Todo lo que sé es que cuando llame a nuevo, obtendría memoria de montón. Si, si creara variables locales, obtendría memoria de la pila. Después de algunas investigaciones en Internet, la respuesta más común es que la memoria de la pila es temporal y la memoria del montón es permanente.
¿El modelo de pila y memoria de montón es un concepto de sistema operativo o arquitectura de computadora? Entonces, ¿es posible que algunos de ellos no sigan el modelo de la pila y el montón de memoria o todos lo sigan?
La memoria de pila y pila es la abstracción sobre el modelo de memoria de la memoria virtual (que puede intercambiar memoria entre el disco y la RAM). ¿Entonces, tanto la pila como la memoria de almacenamiento pueden ser RAM o el disco? Entonces, ¿cuál es la razón por la cual la asignación de montón parece ser más lenta que la contraparte de la pila?
Además, ¿el programa principal se ejecutará en la pila o en un montón?
Además, ¿qué pasaría si un proceso se queda sin la memoria de la pila o la memoria del montón asignada?
Gracias
En C ++, la memoria de la pila es donde se almacenan / construyen las variables locales. La pila también se usa para mantener los parámetros pasados a las funciones.
La pila es muy parecida a la clase std :: stack, insertas parámetros en ella y luego llamas a una función. La función entonces sabe que los parámetros que espera se pueden encontrar al final de la pila. Del mismo modo, la función puede empujar a los locales a la pila y soltarlos antes de regresar de la función. (Las optimizaciones del compilador de advertencias y las convenciones de llamadas no son tan sencillas)
La pila realmente se entiende mejor desde un nivel bajo y recomendaría este enlace Arte de ensamblaje: pasar parámetros en la pila . Rara vez, si alguna vez consideraría algún tipo de manipulación de pila manual desde C ++.
En general, se prefiere la pila, ya que normalmente está en la memoria caché de la CPU, por lo que las operaciones que involucran objetos almacenados en ella tienden a ser más rápidas. Sin embargo, la pila es un recurso limitado y no debe usarse para nada grande. Quedarse sin memoria de pila se denomina desbordamiento de memoria intermedia de pila . Es algo serio de encontrar, pero no deberías encontrar uno a menos que tengas una función recursiva loca o algo similar.
La memoria del montón es mucho más de lo que dice el rskar. En general, en C ++ los objetos asignados con nuevo, o los bloques de memoria asignados con los gustos de malloc terminan en el montón. La memoria de pila casi siempre debe liberarse manualmente, aunque en realidad debería usar una clase de puntero inteligente o similar para evitar tener que recordar hacerlo. Quedarse sin la memoria del montón puede (¿será?) Dar como resultado un std :: bad_alloc.
Es una abstracción del lenguaje: algunos idiomas tienen ambos, alguno, algunos tampoco.
En el caso de C ++, el código no se ejecuta ni en la pila ni en el montón. Puede probar lo que sucede si se queda sin memoria de montón al llamar repetidamente a new
para asignar memoria en un bucle sin llamar a delete
para liberarlo. Pero haga una copia de seguridad del sistema antes de hacer esto .
La memoria de pila es específicamente el rango de memoria al que se puede acceder a través del registro de pila de la CPU. La pila se utilizó como una forma de implementar el patrón de código "Jump-Subrutine" - "Return" en lenguaje ensamblador, y también como un medio para implementar el manejo de interrupciones a nivel de hardware. Por ejemplo, durante una interrupción, la Pila se usó para almacenar varios registros de CPU, incluido el Estado (que indica los resultados de una operación) y el Contador de Programa (donde estaba la CPU en el programa cuando ocurrió la interrupción).
La memoria de pila es en gran medida consecuencia del diseño de CPU habitual. La velocidad de su asignación / desasignación es rápida porque es estrictamente un diseño de último en entrar / primero en salir. Es una simple cuestión de una operación de movimiento y una operación de decremento / incremento en el registro de pila.
La memoria de montón era simplemente la memoria que quedaba después de cargar el programa y asignar la memoria de pila. Puede (o no) incluir espacio variable global (es una cuestión de convención).
Los sistemas operativos multitareas preventivos modernos con memoria virtual y dispositivos mapeados en memoria hacen que la situación actual sea más complicada, pero eso es Stack vs Heap en pocas palabras.