2011-08-19 19 views
11

¿Por qué los lenguajes ensamblados usan tanto una pila como un montón? Parecen redundantes.¿Por qué hay una pila y un montón?

+6

si bien es una buena pregunta, ya está respondida [aquí] (http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars

+0

... 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

Respuesta

12

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.

2

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

3

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.

Cuestiones relacionadas