¿Por qué los lenguajes ensamblados usan tanto una pila como un montón? Parecen redundantes.¿Por qué hay una pila y un montón?
Respuesta
No son redundantes. Cada uno de ellos tiene fortalezas y debilidades: una pila es más rápida si se usa correctamente, porque la asignación de memoria es trivial (push/pop). La desventaja es que solo puedes agregar y eliminar elementos en la parte superior (de ahí el nombre, la pila). Además, el espacio total de la pila es limitado, y cuando te quedas sin combustible, tienes un ... bueno, el desbordamiento de la pila. El montón, por el contrario, permite la asignación aleatoria y la desasignación, y puede almacenar grandes cantidades de datos allí, pero la desventaja es que la asignación conlleva más gastos generales: para cada bloque de memoria asignado, debe encontrarse una porción gratuita adecuada, y en el a largo plazo, se debe evitar la fragmentación del espacio libre y el sistema debe rastrear dónde están los bloques libres.
Utiliza la pila para pasar pequeños valores efímeros, p. Ej. variables de contador local, argumentos de funciones, valores de retorno, etc .; estos se prestan al estilo de asignación push/pop. Para estructuras de datos más grandes o de larga vida, usa el montón.
Se trata de la gestión y el manejo de la memoria. Existen diferentes tipos de registros de arquitecturas x86. Existen posibilidades de administración de memoria compatible con hardware en arquitectura x86, etc.
Stack es utilizado por el puntero de instrucción, Heap es para segmento de datos en algunas aplicaciones.
para leer más consejos que usted lee los siguientes enlaces:
"Un modelo de memoria permite que un compilador para realizar muchas importantes optimizaciones" - Wikipedia
Sin duda podría construir un sistema informático que utilizara cualquiera de ellos como su único modelo de memoria. Sin embargo, ambos tienen propiedades bastante diferentes, cada uno con sus propios puntos buenos y malos. La mayoría de los sistemas utilizan ambos para obtener los beneficios de cada uno de ellos.
Pilas
Una pila puede ser pensado como una pila de platos, se escribe un valor en un plato y lo puso en la parte superior de la pila esto se llama una operación de empuje y almacena un valor de la pila. Obviamente también puedes quitar la placa superior de la pila, esto se llama operación pop. Pero las nuevas asignaciones siempre deben estar en la parte superior de la pila.
La pila se suele usar para variables locales y para pasar valores entre funciones. En general, las pilas tienen las siguientes propiedades impresionantes:
- Requiere sólo un puñado de punteros para gestionar
- Muy fácil de implementar en hardware, la mayoría de los procesadores han incorporado en el soporte de hardware para una pila por lo que es aún más rápido.
- muy rápido para asignar memoria
El problema con la pila viene de solo se pueden añadir los elementos/retirados de la parte superior de la pila de datos. Esto tiene mucho sentido cuando se cruzan hacia arriba y hacia abajo a través de llamadas a funciones: pop funciones entradas de la pila, asigna espacio para variables locales en la pila, ejecuta función, borra variables locales de la parte superior de la pila e inserta el valor de retorno en la pila . Si, por otro lado, quiero asignar algo de memoria y decir pasarlo a otro hilo o, en general, liberarlo muy lejos de donde se asignó, de repente, tengo un problema, la pila no está en la posición correcta cuando quiero para liberar la memoria.
Se podría decir que la pila facilita la asignación de memoria secuencial rápida.
Heap
Ahora el montón es diferente cada asignación es generalmente seguido por separado. Esto ocasiona una gran sobrecarga para las asignaciones y desasignaciones, pero cada una puede manejarse independientemente de otras asignaciones de memoria, hasta que se quede sin memoria.
Hay numerosos algoritmos para lograr esto y es probablemente un poco imprudente a twitter sobre ellos aquí, pero aquí hay un enlace que habla de unos buenos simples algoritmos de asignación del montón: Alternatives to malloc and new
Así el montón facilita al azar asignación de memoria, pero esto viene con una penalización de tiempo de ejecución, sin embargo, esa penalización es a menudo pequeña en lo que se incurriría si tuviera que manejar la situación utilizando solo la pila.
- 1. ¿Por qué la memoria se divide en pila y montón?
- 2. montón y pila de ensamblaje de Windows?
- 3. pila y montón en V8 (JavaScript)
- 4. ¿Qué se almacena en el montón y qué se almacena en la pila?
- 5. Asignación estática en java - montón, pila y generación permanente
- 6. Qué hay en un hilo al lado de una pila
- 7. ¿Por qué querrías asignar memoria en el montón en lugar de la pila?
- 8. Creación de matriz de objetos en la pila y montón
- 9. ¿Hay una implementación Java estándar de un montón de Fibonacci?
- 10. Asignación de memoria del montón y pila de Java
- 11. contenedores STL en la pila y el montón
- 12. ¿Hay una matriz Java de primitivas almacenadas en pila o montón?
- 13. ¿Por qué la asignación de memoria en el montón MUCHO más lento que en la pila?
- 14. ¿Por qué los subprocesos comparten el espacio de montón?
- 15. ¿Por qué hay un límite en el tamaño de la pila?
- 16. CPython: internamente, ¿qué se almacena en la pila y en el montón?
- 17. ¿El montón es realmente un montón?
- 18. ¿Cuál es la relación entre "un" montón y "el" montón?
- 19. Pregunta general: Java tiene el montón y la pila local. ¿Puedes acceder a cualquier objeto del montón?
- 20. ¿Por qué hay un NSInteger?
- 21. montón vs segmento de datos vs asignación de pila
- 22. ¿Por qué un POD en una estructura inicializa cero mediante un constructor implícito al crear un objeto en el montón o un objeto temporal en la pila?
- 23. ¿Por qué siempre hay un argumento de función inútil en la pila?
- 24. sobrecarga para un montón de montón vacío
- 25. ¿Cómo puedo ver qué hay en mi montón en Java?
- 26. ¿Hay un volcado de pila Pretty Print?
- 27. ¿Por qué no hay un método para obtener el tamaño real de la pila?
- 28. Destino de asignación de std :: aligned_storage (¿pila o montón?)
- 29. ¿Por qué hay GLint y GLfloat?
- 30. ¿Por qué necesita especificar el tamaño de pila de Java?
si bien es una buena pregunta, ya está respondida [aquí] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars
... y una una pregunta similar, centrándose en Windows, fue respondida [aquí] (http://stackoverflow.com/questions/2422252/windows-assembly-heap-and-stack) (ya que la otra es específica del sistema operativo, no voy a votar para cerrar , pero es una decisión cercana). – eran