¿Cuál es la diferencia entre montón y pila?
¿Cuál es la diferencia entre montón y pila?
Se puede entender simplemente como:
Montón: es el espacio asignado por funciones como la ubicación de malloc. Las direcciones crecen de menor a mayor.
pila: asigna automáticamente variables y algo de espacio utilizado cuando se llaman funciones. Las direcciones disminuyen de mayor a menor.
Conocimientos preliminares: asignación de memoria del programa
La memoria ocupada por un programa compilado en c/C++ se divide en las siguientes partes
1. (pila): asignado y liberado automáticamente por el compilador para almacenar valores de parámetros de funciones, valores de variables locales, etc. Opera como una pila en una estructura de datos.
2. Área del montón (montón): generalmente lo asigna y libera el programador. Si el programador no lo libera, el sistema operativo puede reciclarlo cuando finaliza el programa. Tenga en cuenta que es diferente del montón en la estructura de datos. El método de asignación es similar a una lista vinculada, jaja.
3. Área global (área estática) (estática): el almacenamiento de variables globales y variables estáticas se coloca juntas. Las variables globales inicializadas y las variables estáticas están en la misma área, y las variables globales no inicializadas y. Las variables estáticas no inicializadas se encuentran en otra área adyacente. - El sistema lo libera una vez finalizado el programa.
4. Área constante literal: la cadena constante se coloca aquí. El sistema lo publicará una vez finalizado el programa.
5. Área de código del programa: almacena el código binario del cuerpo de la función.
2. Programa de ejemplo
Esto está escrito por un senior, muy detallado
//main.cpp
int a = 0 ; Área global inicializada
char *p1; Área global no inicializada
main()
{
int b; >
char s[] = "abc"; pila
char *p2; pila
char *p3 = "123456"; en la pila superior.
static int c =0; área de inicialización global (estática)
p1 = (char *)malloc(10); malloc(20);
Las áreas asignadas de 10 y 20 bytes están en el área del montón.
strcpy(p1, "123456"); 123456 se coloca en el área constante y el compilador puede optimizarlo en el mismo lugar que "123456" señalado por p3.
}
2. Conocimiento teórico de montón y pila
2.1 Método de aplicación
pila:
Por El sistema asigna automáticamente. Por ejemplo, declare una variable local int b en una función; el sistema crea automáticamente espacio para b en la pila
montón:
El programador debe solicitarlo él mismo y especificar el tamaño. En la función c malloc
Por ejemplo, p1 = (char *)malloc(10
Usar nuevo operador en C++
Por ejemplo, p2; = (char *)malloc (10);
Pero tenga en cuenta que p1 y p2 están en la pila.
2.2
Respuesta del sistema después de la aplicación
Pila: Siempre que el espacio restante de la pila sea mayor que el espacio aplicado, el sistema proporcionará memoria para el programa; de lo contrario, se informará una excepción. Desbordamiento de pila.
Montón: En primer lugar, debes saber que el sistema operativo tiene una lista vinculada que registra las direcciones de memoria libre. Cuando el sistema recibe una solicitud del programa,
la recorrerá. la lista vinculada para encontrar el primer espacio mayor que El nodo de montón del espacio solicitado se elimina de la lista de nodos libres y el espacio del nodo se asigna al programa. Además, para la mayoría de los sistemas, estará en el. primera dirección de este espacio de memoria Registre el tamaño de esta asignación para que la declaración de eliminación en el código pueda liberar correctamente este espacio de memoria.
Además, dado que el tamaño del nodo del montón encontrado puede no ser exactamente igual al tamaño solicitado, el sistema automáticamente colocará la parte sobrante nuevamente en la lista enlazada libre.
2.3 Limitación del tamaño de la aplicación
Pila: en Windows, la pila es una estructura de datos que se extiende a direcciones bajas y es un área de memoria continua. Esta oración significa que la dirección de la parte superior de la pila y la capacidad máxima de la pila están predeterminadas por el sistema. En WINDOWS, el tamaño de la pila es 2 M (algunos dicen que es 1 M, en resumen, es una determinación constante). en el momento de la compilación). Si el espacio solicitado excede el espacio restante de la pila, se generará un desbordamiento. Por lo tanto, el espacio disponible en la pila es menor.
Montón: El montón es una estructura de datos que se extiende a direcciones altas y es un área de memoria discontinua. Esto se debe a que el sistema utiliza una lista vinculada para almacenar direcciones de memoria libre, que son naturalmente discontinuas, y la dirección transversal de la lista vinculada es de direcciones bajas a direcciones altas. El tamaño del montón está limitado por la memoria virtual disponible en el sistema informático. Se puede observar que el espacio obtenido por el montón es más flexible y mayor.
2.4 Comparación de la eficiencia de la aplicación:
El sistema asigna automáticamente la pila y es más rápida. Pero el programador no tiene control.
El montón es memoria asignada por nuevos. Generalmente es lento y propenso a la fragmentación de la memoria, pero es la más conveniente de usar.
Además, en WINDOWS, es la mejor manera. es Utilice VirtualAlloc para asignar memoria. No está en el montón o en la pila. Reserva directamente una memoria en el espacio de direcciones del proceso, aunque es el más inconveniente de usar. Pero la velocidad también es la más flexible
2.5 Contenido de almacenamiento en el montón y la pila
Pila: cuando se llama a una función, la primera instrucción enviada a la pila es la siguiente instrucción después la dirección de la función principal. (La siguiente declaración ejecutable de la declaración de llamada de función), y luego los diversos parámetros de la función. En la mayoría de los compiladores de C, los parámetros se insertan en la pila de derecha a izquierda, y luego las variables locales en la. función. Tenga en cuenta que las variables estáticas no se insertan en la pila.
Cuando finaliza esta llamada de función, las variables locales se extraen de la pila primero, luego los parámetros y, finalmente, el puntero superior de la pila apunta a la dirección donde se almacenó por primera vez, que es la siguiente instrucción. en la función principal El programa comienza desde este punto Sigue ejecutándose.
Montón: generalmente, se utiliza un byte para almacenar el tamaño del montón en la cabecera del montón. El contenido específico del montón lo organiza el programador.
2.6 Comparación de eficiencia de acceso
char s1[] = "aaaaaaaaaaaaaaa"
char *s2 = "bbbbbbbbbbbbbb"
; aaaaaaaaaaa se asigna en tiempo de ejecución
Y bbbbbbbbbbb se determina en tiempo de compilación
Sin embargo, en accesos posteriores, la matriz en la pila es más grande que las cadenas puntiagudas (p. ej. montón) son rápidos.
Por ejemplo:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p="1234567890";
a = c[1]; p >a = p[1];
return;
}
Código ensamblador correspondiente
10: a = c[1] ];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+ 1 ]
00401073 88 45 FC mov byte ptr [ebp-4],al
El primer método es leer directamente los elementos de la cadena en el registro cl al leer. el segundo tipo requiere primero apuntar a edx y luego leer caracteres basados en edx, lo cual obviamente es lento.
Resumen de 2.7:
La diferencia entre montón y pila se puede ver con la siguiente metáfora:
Usar la pila es como ir a un restaurante a comer , simplemente pida comida (emita una solicitud), pague y coma (use) y salga cuando esté lleno. No tiene que preocuparse por trabajos de preparación como cortar y lavar verduras, ni por trabajos de acabado como lavar platos y. ollas. Su ventaja es que es rápido, pero tiene mucha libertad.
Usar montón es como hacer tus propios platos favoritos. Es más problemático, pero se adapta más a tus gustos y tiene una gran libertad.
Las principales diferencias entre el montón y la pila son:
El montón y la pila en el sistema operativo, como los mencionados anteriormente, no se discutirán en detalle.
También existe el montón y la pila en términos de estructuras de datos. Estos son conceptos diferentes. El montón aquí en realidad se refiere a una estructura de datos de una cola de prioridad (que satisface las propiedades del montón). El primer elemento tiene la prioridad más alta, la pila en realidad se refiere a una estructura matemática o de datos que satisface la propiedad de primero en entrar, último en salir; .
Aunque la pila y la pila se llaman juntas, siguen siendo muy diferentes. Se llaman consecutivamente solo por razones históricas.
La explicación anterior es que Baidu sabe que fue transferida desde el. Preguntas y respuestas. Estos dos conceptos han estado borrosos durante mucho tiempo. Ahora entiendo por qué a la especialización en informática se le enseñó "estructura de datos" Jaja, ¡tengo que compensarlo cuando tenga tiempo!