Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cuáles son las diferencias entre el montón y la pila de Python?

¿Cuáles son las diferencias entre el montón y la pila de Python?

El montón y la pila son dos conceptos que los desarrolladores deben enfrentar al comprender estos dos conceptos, deben colocarse en escenarios específicos, porque en diferentes escenarios, el montón y la pila representan significados diferentes. En términos generales, tiene dos significados:

(1) En el escenario de diseño de memoria del programa, el montón y la pila representan dos métodos de administración de memoria.

(2) Escenario de estructura de datos A continuación, montón; y la pila representan dos estructuras de datos de uso común.

Recomendación relacionada: "Tutorial de Python"

El montón y la pila son en realidad dos formas en que el sistema operativo administra el espacio de memoria ocupado por el proceso. Las principales diferencias son las siguientes:

p>

(1) Los métodos de gestión son diferentes. El sistema operativo asigna y libera automáticamente la pila, sin nuestro control manual, el programador controla la aplicación y la liberación del montón, lo que es propenso a pérdidas de memoria;

(2) El tamaño de el espacio es diferente. El tamaño de la pila que posee cada proceso es mucho menor que el tamaño del montón. En teoría, el tamaño del montón que los programadores pueden solicitar es el tamaño de la memoria virtual. El tamaño de la pila de procesos es de 1 MB de forma predeterminada para Windows de 64 bits y de 10 MB para Linux de 64 bits;

(3) Las direcciones de crecimiento son. diferente. La dirección de crecimiento del montón es hacia arriba y las direcciones de memoria son de menor a mayor; la dirección de crecimiento de la pila es hacia abajo y las direcciones de memoria son de mayor a menor.

(4) Los métodos de distribución son diferentes. Los montones se asignan dinámicamente, no hay ningún montón asignado estáticamente. Hay dos formas de asignar la pila: asignación estática y asignación dinámica. La asignación estática la realiza el sistema operativo, como la asignación de variables locales. La asignación dinámica la asigna la función alloca, pero la asignación dinámica de la pila es diferente de la del montón. Su asignación dinámica la libera el sistema operativo y no requiere que la implementemos manualmente.

(5) La eficiencia de la asignación es diferente. La pila es asignada automáticamente por el sistema operativo, que proporciona soporte para la pila a nivel de hardware: se asignan registros especiales para almacenar la dirección de la pila y se ejecutan instrucciones especiales para empujar y extraer la pila, lo que determina la eficiencia de la pila. El montón es aplicado y administrado por funciones de biblioteca u operadores proporcionados por C/C++. El mecanismo de implementación es relativamente complejo y las aplicaciones de memoria frecuentes son propensas a la fragmentación de la memoria. Obviamente, la eficiencia del montón es mucho menor que la de la pila.

(6) El contenido del almacenamiento es diferente. Los contenidos almacenados en la pila, direcciones de retorno de funciones, parámetros relacionados, variables locales y contenidos de registros, etc. Cuando la función principal llama a otra función, debe usar la pila para guardar el punto de interrupción de ejecución de la función actual. Lo primero que se inserta en la pila es la dirección de la siguiente declaración de la función principal, es decir, el contenido de la función principal. registro de puntero extendido (EIP), y luego La dirección inferior del marco de pila actual, es decir, el contenido del registro de puntero base extendido (EBP), y luego los parámetros reales de la función llamada, etc., generalmente se insertan en el apilar en orden de derecha a izquierda, seguido de las partes locales de la función llamada. Variables, tenga en cuenta que las variables estáticas se almacenan en el segmento de datos o segmento BSS y no se insertan en la pila. El orden de extracción de la pila es exactamente el opuesto. Finalmente, la parte superior de la pila apunta a la dirección de la siguiente declaración de la función principal y el programa principal comienza a ejecutarse desde esta dirección. Montón, generalmente se utiliza un byte de espacio en la parte superior del montón para almacenar el tamaño del montón, y el programador llena el contenido de almacenamiento específico en el montón.

Como puede ver en lo anterior, en comparación con la pila, el uso de una gran cantidad de malloc()/free() o new/delete puede causar fácilmente una gran fragmentación de la memoria y puede Causa el cambio entre el modo de usuario y el modo kernel, la eficiencia es baja. En comparación con el montón, la pila se usa más ampliamente en los programas. El proceso de llamada de función más común se implementa mediante la pila. La dirección de retorno de la función, el EBP, los parámetros reales y las variables locales se almacenan en la pila. Aunque la pila tiene muchos beneficios, porque no es tan flexible en comparación con el montón, a veces el montón se utiliza principalmente para asignar una gran cantidad de espacio de memoria.

Ya sea un montón o una pila, se debe evitar el cruce ilegal de límites cuando se utiliza la memoria. El acceso ilegal a la memoria causado por cruzar el límite puede destruir los datos del montón y la pila del programa, o incluso causar la destrucción. El programa se ejecuta en un estado incierto y obtiene los resultados esperados. Si no se obtienen, el programa puede fallar de manera anormal. Todos estos son problemas a los que debemos prestar atención cuando tratamos con la memoria durante la programación.