Red de conocimientos turísticos - Información de alquiler - ¿Qué son la pila y el montón?

¿Qué son la pila y el montón?

Pregunta 1: ¿Cuál es la diferencia entre montón y pila? 1. Conocimientos preliminares: asignación de memoria del programa D

La memoria ocupada por un programa compilado en c/C++ se divide en la siguiente parte

1. El compilador asigna y libera automáticamente el área de la pila (pila) D para almacenar valores de parámetros de funciones, valores de variables locales, etc. Opera como una pila en una estructura de datos.

2. El programador generalmente asigna y libera el área del montón (montón) D. 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) D. Las variables globales y las variables estáticas se almacenan juntas. Las variables globales inicializadas y las variables estáticas están en la misma área. otra zona adyacente. - El sistema lo libera una vez finalizado el programa.

4. Aquí se coloca la cadena constante D del área constante de texto. El sistema lo publicará una vez finalizado el programa.

5. El área de código del programa D 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 de inicialización

char *p1; Área global no inicializada

main()

{

int b; p> char s[] = abc; stack

char *p2; stack

char *p3 = 123456\0 está en el área constante y p3 está en la pila. .

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\0 se coloca en el área constante, y el compilador puede optimizarlo y 123456 señalado por p3 en el mismo lugar.

}

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 c función 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 de lo contrario, se informará una excepción. Solicite desbordamiento de pila.

Montón: En primer lugar, debe saber que el sistema operativo tiene una lista vinculada que registra las direcciones de memoria libre. Cuando el sistema recibe una solicitud del programa,

recorrerá el montón. 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 primero. 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 Límite de 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 desde la dirección baja...>>

Pregunta 2: Pila y Diferencias específicas entre las características de lectura y almacenamiento de datos y el montón

Montón, prioridad de cola, primero en entrar, primero en salir (FIFO-primero en entrar, primero en salir)

Pila, primero en entrar, último en salir (FILO- Primero en entrar/Último en salir).

La diferencia entre montón y pila no tiene nada que ver con el lenguaje de programación, sino que está relacionada con los diferentes métodos de almacenamiento de datos del propio hardware. Los tipos de datos almacenados en el montón y en la pila en diferentes idiomas no son necesariamente los mismos.

1. La pila y el montón son lugares utilizados por Java para almacenar datos en Ram. A diferencia de C++, Java administra automáticamente la pila y el montón, y los programadores no pueden configurar directamente la pila o el montón.

2. La ventaja de la pila es que la velocidad de acceso es más rápida que la del montón, solo superada por los registros ubicados directamente en la CPU. Pero la desventaja es que se debe determinar el tamaño y la vida útil de los datos almacenados en la pila y hay una falta de flexibilidad. Además, los datos de la pila no se pueden compartir entre varios subprocesos o varias pilas, pero varias variables con valores iguales dentro de la pila pueden apuntar a una dirección. Consulte el punto 3 para obtener más detalles. La ventaja del montón es que puede asignar dinámicamente el tamaño de la memoria y no es necesario informar al compilador de antemano la vida útil. El recolector de basura de Java recopilará automáticamente los datos que ya no se utilizan. Pero la desventaja es que debido a la necesidad de asignar memoria dinámicamente en tiempo de ejecución, la velocidad de acceso es lenta.

3. Hay dos tipos de tipos de datos en Java.

Uno son los tipos primitivos, de los cuales hay 8 tipos, a saber, int, short, long, byte, float, double, boolean, char (tenga en cuenta que no existe un tipo básico de cadena). Este tipo de definición se define en la forma int a = 3; long b = 255L y se denomina variable automática. Vale la pena señalar que las variables automáticas almacenan valores literales, no instancias de clases, es decir, no son referencias a clases. Aquí no hay clases. Por ejemplo, int a= 3; donde a es una referencia que apunta al tipo int, que apunta al valor literal 3. Dado que los datos de estos valores literales se pueden conocer en tamaño y vida útil (estos valores literales se definen de forma fija en un determinado bloque de programa y los valores de campo desaparecen después de que sale el bloque de programa), por razones de velocidad , existen en la pila.

Pregunta 3: ¿Cuál es la diferencia entre montón y pila en Java? Sea más detallado. ¿Cuál es la diferencia entre montón y pila en Java? La pila y el montón son parte de la memoria.

La pila tiene un espacio pequeño y es relativamente rápida.

p>

heep es grande, generalmente todos los objetos creados se colocan aquí.

Pila: es una estructura de datos de primero en entrar y último en salir, generalmente utilizada para guardar parámetros y variables locales en métodos (funciones).

En java, todos los tipos básicos y de referencia. Los tipos se almacenan en la pila. El espacio habitable de los datos en la pila generalmente está dentro del alcance actual (es decir, el área encerrada por

montón: es dinámico). espacio de memoria solicitado (la lista vinculada que registra el espacio de memoria libre la mantiene el sistema operativo), el espacio de memoria generado por la declaración malloc en C está en el montón

En Java, todos usan el nuevo xxx. () Los objetos construidos se almacenan en el montón. Cuando el recolector de basura detecta que no se hace referencia a un objeto, lo destruirá automáticamente. Por lo tanto, en teoría, no hay límite para el espacio habitable de los objetos en Java, siempre y cuando. hay un tipo de referencia que apunta a él, entonces se puede usar en cualquier lugar

1. La pila y el montón son lugares utilizados por Java para almacenar datos en Ram. A diferencia de C++, Java administra automáticamente la pila y el montón, y los programadores no pueden configurar directamente la pila o el montón.

2. La ventaja de la pila es que la velocidad de acceso es más rápida que la del montón, solo superada por los registros ubicados directamente en la CPU. Pero la desventaja es que se debe determinar el tamaño y la vida útil de los datos almacenados en la pila y hay una falta de flexibilidad. Además, los datos de la pila se pueden compartir; consulte el punto 3 para obtener más detalles. La ventaja del montón es que puede asignar dinámicamente el tamaño de la memoria y no es necesario informar al compilador de antemano la vida útil. El recolector de basura de Java recopilará automáticamente los datos que ya no se utilizan. Pero la desventaja es que debido a la necesidad de asignar memoria dinámicamente en tiempo de ejecución, la velocidad de acceso es lenta.

3. Hay dos tipos de tipos de datos en Java.

Uno son los tipos primitivos, de los cuales hay 8 tipos, a saber, int, short, long, byte, float, double, boolean, char (tenga en cuenta que no existe un tipo básico de cadena). Este tipo de definición se define en la forma int a = 3; long b = 255L y se denomina variable automática. Vale la pena señalar que las variables automáticas almacenan valores literales, no instancias de clases, es decir, no son referencias a clases. Aquí no hay clases. Por ejemplo, int a = 3; donde a es una referencia que apunta al tipo int, que apunta al valor literal 3. Dado que los datos de estos valores literales se pueden conocer en tamaño y vida útil (estos valores literales se definen de forma fija en un determinado bloque de programa y los valores de campo desaparecen después de que sale el bloque de programa), por razones de velocidad , existen en la pila.

Además, la pila tiene una característica especial muy importante, es decir, los datos almacenados en la pila se pueden compartir. Supongamos que definimos al mismo tiempo:

int a = 3;

int b = 3

El compilador procesa int a = 3 primero; estará en la pila Cree una referencia a la variable a en y luego busque para ver si hay una dirección con un valor literal de 3. Si no la encuentra, abra una dirección para almacenar el valor literal de 3 y luego apunte a a la dirección de 3. Luego procese int b = 3; después de crear la variable de referencia de b, dado que ya hay un valor literal de 3 en la pila, b apuntará directamente a la dirección de 3.

De esta manera, existe una situación en la que a y b apuntan a 3 al mismo tiempo. Es importante señalar que la referencia de este valor literal es diferente de la referencia del objeto de clase.

Suponga que las referencias de dos objetos de clase apuntan al mismo objeto al mismo tiempo. Si una variable de referencia de objeto modifica el estado interno del objeto, entonces la otra variable de referencia de objeto reflejará inmediatamente el cambio.

Por el contrario, modificar el valor de un valor literal por su referencia no hará que el valor de otra referencia que apunte a este valor literal cambie también. Como en el ejemplo anterior, después de definir los valores de a y b, establecemos a = 4, entonces b no será igual a 4, pero seguirá siendo igual a 3; Dentro del compilador, cuando encuentre a=4;, volverá a buscar si hay un valor literal de 4 en la pila. De lo contrario, volverá a abrir una dirección para almacenar el valor de 4 si ya existe. , apuntará directamente a esta dirección.

Por lo tanto, el valor de a...>>

Pregunta 4: ¿Cuál es la diferencia entre el montón y la pila? La diferencia entre el montón y la pila:

1. La diferencia en la asignación del espacio de la pila:

1. Pila (sistema operativo): asignada y liberada automáticamente por el sistema operativo, almacenando valores de parámetros de función, valores de variables locales, etc. Su método de operación es similar a la pila en la estructura de datos

2. Montón (sistema operativo): generalmente lo asigna y libera el programador. Si el programador no lo libera, puede reciclarlo. por el sistema operativo cuando finaliza el programa. El método de asignación es similar a una lista vinculada.

2. Diferencias en los métodos de almacenamiento en caché de la pila:

1. La pila utiliza un caché de primer nivel. Generalmente están en el espacio de almacenamiento cuando se llaman y se liberan inmediatamente después. la llamada se completa;

p>

2. El montón se almacena en el caché de segundo nivel y su ciclo de vida está determinado por el algoritmo de recolección de basura de la máquina virtual (no significa eso). se puede reciclar una vez que se convierte en un objeto huérfano). Por lo tanto, la velocidad de llamada de estos objetos es relativamente baja.

3. Diferencias en las estructuras de datos de la pila:

Montón (estructura de datos): el montón se puede considerar como un árbol, como: clasificación de montón

Pila (estructura de datos): una estructura de datos de primero en entrar y último en salir.

Pregunta 5: Describa brevemente la diferencia y la conexión entre el montón y la pila. Puntos clave del montón y la pila:

Montón, prioridad de la cola, primero en entrar, primero en salir (FIFO, primero en entrar, primero). afuera).

Apilar, primero en entrar, último en salir (FILO-First-In/Last-Out).

En circunstancias normales, si alguien junta la pila, significa una pila, no un montón.

Análisis comparativo de montón y pila:

1. Asignación de espacio de pila

Pila (sistema operativo): asignada y liberada automáticamente por el sistema operativo para almacenar funciones valor de los parámetros, el valor de una variable local, etc. Opera como una pila en una estructura de datos.

Montón (sistema operativo): generalmente asignado y liberado por el programador. Si el programador no lo libera, el sistema operativo puede reciclarlo cuando finaliza el programa. El método de asignación es similar a una lista vinculada.

2. Método de almacenamiento en caché de pila

La pila utiliza un caché de primer nivel. Generalmente están en el espacio de almacenamiento cuando se llaman y se liberan inmediatamente después de que se completa la llamada.

El montón se almacena en la caché de segundo nivel y el ciclo de vida está determinado por el algoritmo de recolección de basura de la máquina virtual (no se puede reciclar una vez que se convierte en un objeto huérfano). Por lo tanto, la velocidad de llamada de estos objetos es relativamente baja.

3. Diferencias en las estructuras de datos de la pila

Montón (estructura de datos): el montón se puede considerar como un árbol, como: clasificación de montón.

Pila (estructura de datos): una estructura de datos de primero en entrar y último en salir.

Pregunta 6: La diferencia entre montón y pila en Java. El montón de Java es un área de datos en tiempo de ejecución, a partir de la cual la clase (los objetos asignan espacio. Estos objetos se crean mediante instrucciones como new, newarray, anewarray y multianewarray. No es necesario que el código del programa se libere explícitamente. El montón es responsable de la recolección de basura. La ventaja del montón es que puede asignar dinámicamente el tamaño de la memoria y no es necesario informarle al compilador la vida útil. porque asigna memoria dinámicamente en tiempo de ejecución. El recolector de basura de Java recopilará automáticamente estos datos que ya no se utilizan. Sin embargo, la desventaja es que la velocidad de acceso es lenta debido a la asignación dinámica de memoria en tiempo de ejecución. La ventaja de la pila es la velocidad de acceso. Es más rápida que el montón, solo superada por el registro, y los datos de la pila se pueden compartir. Sin embargo, la desventaja es que se debe determinar el tamaño y la vida útil de los datos almacenados en la pila. y la pila almacena principalmente algunos tipos básicos de variables (, int, short, long, byte, float, double, boolean, char) y identificadores de objetos.

La pila tiene una característica especial muy importante, es decir. , los datos almacenados en la pila se pueden compartir.

Supongamos que definimos al mismo tiempo:

int a = 3;

int b = 3

El compilador procesa int a = 3 primero; estará en la pila Cree una referencia a la variable a en y luego busque para ver si hay un valor de 3 en la pila. Si no lo encuentra, almacene 3 en y luego apunte a 3. Luego procese int b = 3; después de crear la variable de referencia de b, debido a que ya hay un valor de 3 en la pila, b apuntará directamente a 3. De esta manera, existe una situación en la que a y b apuntan a 3 al mismo tiempo.

En este momento, si se establece a=4 nuevamente, el compilador buscará nuevamente si hay un valor 4 en la pila. Si no, almacenará 4 y señalará 4; Si ya existe, apunte directamente a esta dirección. Por lo tanto, los cambios en el valor de a no afectarán el valor de b.

Cabe señalar que el intercambio de este tipo de datos es diferente del intercambio en el que las referencias de dos objetos apuntan a un objeto al mismo tiempo, porque en este caso, la modificación de un testamento no afecta a b, lo realiza el compilador, lo que ayuda a ahorrar espacio. Si una variable de referencia de objeto modifica el estado interno del objeto, afectará a otra variable de referencia de objeto.

La cadena es un tipo de datos contenedor especial. Se puede crear usando:

String str = new String(abc);

String str = abc

Se utilizan dos formas, la primera es; para usar new() para crear un nuevo objeto, se almacenará en el montón. Se crea un nuevo objeto cada vez que se llama.

El segundo método es crear primero una variable de referencia de objeto str de la clase String en la pila y luego verificar si abc está almacenado en la pila. Si no, almacene abc en la pila y haga que str sea un punto. "abc", si ya existe "abc", apunte directamente str a "abc".

Al comparar si los valores en la clase son iguales, use el método igual () cuando pruebe si las referencias de dos clases de empaquetado apuntan al mismo objeto, use ==. la teoría anterior.

Cadena str1 = abc;

Cadena str2 = abc

System.out.println(str1==str2); > Se puede ver que str1 y str2 apuntan al mismo objeto.

Cadena str1 =nueva cadena (abc);

Cadena str2 =nueva cadena (abc

System.out.println(str1==cadena2); ; false

Usar new es generar diferentes objetos. Genera uno a la vez.

Por lo tanto, si utiliza el primer método para crear varias cadenas "abc", en realidad solo hay un objeto en la memoria. Esta forma de escribir es beneficiosa para ahorrar espacio en la memoria. Puede mejorar la velocidad de ejecución del programa hasta cierto punto, porque la JVM ajustará automáticamente los datos en la pila... >>

Pregunta 7: La diferencia entre el montón y la pila en los datos. La estructura es de 5 puntos. En pocas palabras, el montón está desordenado. Puede realizar cualquier operación de inserción a voluntad, mientras que la operación de cualquier elemento en la pila es ordenada y restringida.

Básicamente, leer y escribir Las reglas son diferentes

No es necesario considerar la forma de almacenamiento

Pregunta 8: La diferencia entre montón y pila Montón y pila

Pila: por El compilador asigna y libera automáticamente, generalmente almacena parámetros de función, variables locales, etc.

Montón: asignado y liberado por el programador si el proceso no es. liberado, el sistema lo libera

Diferencia 1: Cómo solicitar memoria

Pila: asignada automáticamente por el sistema, como la declaración de una variable, abrirá espacio al mismo tiempo, (int a; abre 4 bytes de espacio) (especificado estáticamente)

Montón: por Cuando los programadores solicitan, deben especificar el tamaño (asignación dinámica)

Diferencia 2 : Diferencia en la respuesta del sistema

Pila: siempre que el espacio restante sea mayor que la memoria solicitada, el sistema lo proporcionará; de lo contrario, la pila se desbordará.

Montón: verifique el. lista de direcciones libre, busque la que cumpla con los requisitos, elimine la dirección y asígnela al programa. La primera dirección de la dirección interna registra el tamaño asignado (conveniente para eliminar) y el exceso de memoria se recicla

<. p> Diferencia 3: Diferentes tamaños de espacio

Pila: continua, una constante determinada en el momento de la compilación

Montón: discontinuo, su límite superior está determinado por la memoria virtual efectiva en el sistema

Diferencia 4: Diferencia en la eficiencia de ejecución

Pila: asignada por el sistema, rápida

Montón: asignada por el programador, lenta, propensa a la fragmentación de la memoria Pero. es conveniente de usar

Diferencia 5: Diferencias en la ejecución de funciones

Pregunta 9: ¿Cuál es la diferencia entre la pila y el montón en la memoria de iOS? Esos datos están en la pila, en el montón. La diferencia entre montón y pila en iOS

Método de administración:

Para la pila, el compilador la administra automáticamente, sin nuestra ayuda. control manual; para el montón, el trabajo de liberación lo controla el programador y es fácil que se produzcan pérdidas de memoria.

Tamaño de la aplicación:

Pila: en Windows, la pila es una estructura de datos que se extiende a direcciones inferiores y es un área de memoria continua. Lo que esta oración significa es que la dirección en 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 1 M, en resumen, es una constante determinada por). el compilador). Si aplica Cuando el espacio excede el espacio restante de la pila, se produce un desbordamiento. Por lo tanto, hay menos espacio disponible para la pila.

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 montón de risas 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.

Problema de fragmentación:

Para el montón, la nueva/eliminación frecuente inevitablemente causará discontinuidad en el espacio de memoria, lo que resultará en una gran cantidad de fragmentos y reducirá la eficiencia del programa. Para la pila, este problema no existe, porque la pila es una cola de primero en entrar y último en salir. Están en una correspondencia uno a uno que nunca es posible sacar una memoria de la pila. .

Método de asignación:

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 compilador, como la asignación de variables locales. La asignación dinámica la asigna la función alloc, pero la asignación dinámica de la pila es diferente de la del montón. Su asignación dinámica la libera el compilador y no requiere que la implementemos manualmente.

Eficiencia de asignación:

La pila es una estructura de datos proporcionada por el sistema de la máquina. La computadora brindará soporte en la pila subyacente y asignará registros especiales para almacenar la dirección de la pila. Hay funciones especiales para empujar y hacer estallar la pila. Las instrucciones se ejecutan, lo que determina que la eficiencia de la pila es relativamente alta. El montón lo proporciona la biblioteca de funciones C/C++ y su mecanismo es muy complejo.

Pregunta 10: ¿Cómo se asignan el montón y la pila en la pila en circunstancias normales? La diferencia entre el montón y la pila 1. Conocimientos preliminares: asignación de memoria del programa La memoria ocupada por un programa compilado. por C/C++ se divide en las siguientes varias partes: 1. Área de pila (pila): asignada y liberada 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. Montón: normalmente programadores...