Tome prestada la diferencia entre montón y pila en lenguaje C para explicar la diferencia entre los dos en IOS.
La memoria ocupada por los programas compilados C/C se divide en las siguientes partes.
1. pila: asignada y liberada automáticamente por el compilador para almacenar valores de parámetros de funciones, valores de variables locales, etc. Esa
operación es similar a una pila en una estructura de datos. ? (Suplemento: el sistema recicla automáticamente las variables locales fuera del ciclo de vida)
2. Montón: generalmente liberado por el programador. Si el programador no lo libera, el sistema operativo eventualmente puede devolver el programa. .
Tómalo. Tenga en cuenta que la estructura de datos es diferente de la del montón y el método de asignación es similar al de una lista vinculada, jaja. ? (Suplemento: ¿El espacio dejado libre por malloc y alloc debe liberarse manualmente?)
3. Área global (área estática): las variables globales y las variables estáticas se almacenan juntas e inicializan.
Las variables globales y las variables estáticas están en la misma área, y las variables globales no inicializadas son adyacentes a las variables estáticas no inicializadas.
Una zona. - Liberado por el sistema una vez finalizado el programa. ? (Suplemento: variables modificadas por la palabra clave estática. Los datos en esta área siempre existirán durante todo el ciclo de vida de la aplicación y el sistema solo los reciclará cuando salga el programa).
4. área— —Aquí es donde pones tus cadenas constantes. El sistema lo publica una vez finalizado el programa.
5. Área de código de programa: almacena el código binario del cuerpo de la función.
//Insertar comprensión de IOS a mitad de camino
¿Sistema operativo iOS? La memoria de la computadora utilizada por la aplicación no es un espacio asignado uniformemente. El espacio utilizado para ejecutar el código se encuentra en tres áreas de memoria diferentes, divididas en tres segmentos: "¿Segmento de texto?", "¿Segmento de pila?", "¿Segmento de montón?". .
El segmento "¿segmento de texto?" es el segmento de memoria donde reside el código de la aplicación cuando la aplicación se está ejecutando. Cada instrucción, función, procedimiento, método y código de ejecución existe en este segmento de memoria hasta que se cierra la aplicación. En general, no es necesario que entiendas este párrafo.
Cuando se inicia la aplicación, ¿función main()? ¿Se llama, asignar algo de espacio en la "pila"? medio. Este es otro segmento de espacio de memoria asignado para la aplicación, que es la memoria asignada para las necesidades de almacenamiento de las variables de función. Cuando se llama a una función en una aplicación a la vez, ¿parte de la "pila" se asigna a la "pila"? ¿Llamarlo "marco"? . Aquí se asignan las variables locales de la nueva función.
Como sugiere el nombre, "¿pila?" ¿Es LIFO? )estructura. Cuando una función llama a otra función, se creará un "marco de pila"; cuando la otra función salga, este "marco" se destruirá automáticamente.
¿"Montón"? ¿Un segmento también se llama "datos"? Segmento, que proporciona un intermediario de preservación durante toda la ejecución de la función. Las variables globales y estáticas se mantienen en el "montón" hasta que se cierra la aplicación.
¿Para acceder a algo que creaste en el montón? ¿Necesita al menos un dato de la pila? ¿Puntero debido a tu CPU? ¿A través de la pila? ¿Puntero de acceso en el montón? Entrada de datos.
¿Se te ocurre pila? El puntero es solo una variable entera que contiene el montón. Los datos en una dirección de memoria específica en . En realidad es un poco complicado, pero esa es su estructura básica.
En resumen, ¿el sistema operativo utiliza una pila? ¿Valor del puntero en el segmento accede al montón? objetos en el segmento. ¿Qué pasa si la pila? ¿Qué pasa si el puntero al objeto falta en el montón? No se puede acceder al objeto en. Esta es también la causa de las pérdidas de memoria.
¿En iOS? ¿Pila del sistema operativo? ¿Duan y Xipu? Los segmentos le permiten crear objetos de datos.
¿Apilar? Los objetos tienen dos ventajas principales: primero, son rápidos de crear; segundo, son simples de administrar y tienen un ciclo de vida estricto. ¿Pila? La desventaja de los objetos es que son inflexibles. Siempre es tan largo como cuando fue creado. ¿Qué función se crea en el momento de la creación y su propietario? Siempre ha sido así. ¿No como un montón? ¿Puede un objeto tener varios propietarios? , de hecho, ¿varios propietarios? Equivalente al recuento de referencias. ¿Solo un montón? Los objetos se gestionan mediante métodos de recuento de referencias.
¿Apilar? Creación de objetos
¿Siempre que el espacio restante de la pila sea mayor que la pila? El objeto solicita espacio de creación y el sistema operativo proporcionará este espacio de memoria para el programa. De lo contrario, se informará una excepción de desbordamiento de pila.
¿Montón? Creación de objetos
¿El sistema operativo del montón de memoria? Utilice listas vinculadas para gestionar segmentos. El sistema operativo tiene una lista vinculada de direcciones de memoria libre. Cuando se recibe una aplicación de un programa, ¿recorre la lista enlazada buscando el primer espacio más grande que el montón? nodo, luego elimine el nodo de la lista de nodos libres y asigne el espacio del nodo al programa.
Por ejemplo:
NSString? ¿El objeto es una pila? ¿Objeto en NSMutableString? ¿El objeto es un montón? objetos en . La longitud de la memoria asignada cuando se crea el primero es fija y no se puede modificar; la longitud de la memoria asignada por el segundo es variable y puede tener múltiples propietarios. Un modelo de gestión de memoria adecuado para la gestión de recuentos.
Los métodos de creación de los dos objetos también son diferentes. ¿El primero crea directamente "ns string * str 1 = @"welcome;? ", mientras que el segundo debe asignarse antes de la inicialización". NSMutableString * mstr 1 =[[NSMutableString alloc]initWithString:@ " bienvenido "];?".
Una cosa más, este es el montón y la pila del sistema operativo.
Cuando aprendemos "estructura de datos", los conceptos de montón y pila son diferentes de los de este sistema operativo.
El montón y la pila del sistema operativo se refieren a algunos métodos de operación y administración de memoria. /p>
p>
El montón de "estructura de datos" en realidad se refiere a la cola de prioridad. ¿El elemento número 1 de la pila es en realidad un dato o una estructura de datos? satisface la propiedad primero en entrar, último en salir
//Fin de la inserción
En segundo lugar, el programa de muestra
Esto está escrito por un senior y es muy detallado
>main.cpp
int a = 0; área de inicialización global
char * p 1;
main()
{
int b;shed
char s[]= "ABC";shed
char * p2 shed
char * P3 = " 123456 "; 123456/0 está en el área constante, p3 está en la pila
Static int c = 0; área de inicialización
p 1 = (char *)malloc(10);
p2 =(char *)malloc(20);
Las áreas de asignación 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 compararlo con "123456" señalado por p3.
Optimizar en un solo lugar. p>
}
2. Conocimiento teórico de montón y pila
2.1 Método de aplicación
Asignación automática por el sistema. Por ejemplo, declara una variable local int b en una función; el sistema deja automáticamente un espacio para B en la pila
. separado/en/entre habitaciones
Montón:
El programador debe solicitarlo y especificar el tamaño
Por ejemplo, p 1 = (char *. ) malloc (10);
Utilice el nuevo operador en C
Por ejemplo, p2 = new char[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 solicitado, el sistema proporcionará memoria para el programa; de lo contrario, informará un desbordamiento de pila de excepción.
Fuera.
Montón: En primer lugar, debes saber que el sistema operativo tiene una lista vinculada de direcciones de memoria libres. Cuando el sistema recibe la aplicación del programa,
recorrerá la lista vinculada, encontrará el primer nodo del montón con un espacio mayor que el espacio de la aplicación y luego transferirá el nodo de la lista vinculada de nodos libres.
Elimine el nodo y asigne el espacio del nodo al programa. Además, en la mayoría de los sistemas estará en este espacio de memoria.
Registre el tamaño de esta asignación en la primera dirección para que la instrucción de eliminación en el código pueda liberar correctamente el espacio de memoria.
Además, debido a que el tamaño del nodo del montón encontrado no es necesariamente exactamente igual al tamaño de la aplicación, el sistema transferirá automáticamente el exceso.
Vuelve a poner estos puntos en la lista libre.
2.3 Limitaciones en la escala de la aplicación
Pila: en Windows, la pila es una estructura de datos que se extiende a direcciones de orden inferior y áreas de memoria continua. El significado de esta oración
Pensando en ello 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 (también disponible.
Es 1 M, que es una constante determinada en el momento de la compilación). Si el espacio de la aplicación excede el espacio restante de la pila,
se desbordará. Por tanto, se puede obtener menos espacio de la pila.
Montón: El montón es una estructura de datos que se extiende a direcciones de orden superior y es un área de memoria discontinua. Esto se debe a que el sistema está almacenado en una lista vinculada.
Las direcciones de memoria libre son naturalmente discontinuas y la dirección transversal de la lista vinculada es desde la dirección baja hasta la dirección alta. 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 eficiencia de la aplicación:
El sistema asigna automáticamente la pila y es más rápida. Pero el programador no tiene control sobre ello.
El montón es memoria asignada por nuevos. Generalmente es lento y propenso a la fragmentación de la memoria, pero es el más conveniente de usar.
Además, en WINDOWS, la mejor manera es utilizar VirtualAlloc para asignar memoria, no en el montón o en la pila.
Reserva un trozo de memoria directamente en el espacio de direcciones del proceso, aunque es el más incómodo de usar. Pero es rápido y más flexible.
2.5 Almacenamiento en el montón y en la pila
Pila: cuando se llama a una función, la primera instrucción en la función principal es la siguiente instrucción (la siguiente instrucción en la declaración de llamada de función es puede ser
la dirección de la declaración de ejecución), y luego los parámetros de la función. En la mayoría de los compiladores de C, los argumentos se apilan de derecha a izquierda.
, luego variables locales en la función. Tenga en cuenta que las variables estáticas no están apiladas.
Cuando se completa esta llamada a la función, primero se muestran las variables locales, luego los parámetros y, finalmente, el puntero superior de la pila apunta a la ubicación donde se almacenaron originalmente.
Dirección, es decir, la siguiente instrucción en la función principal, y el programa continúa ejecutándose desde aquí.
Montón: normalmente, el tamaño del montón se almacena en un byte en el encabezado del montón. El contenido específico del montón lo organiza el programador.
2.6 Comparación de eficiencia de acceso
char s 1[]= " aaaaaaaaaaaaaaaa ";
char * s2 = " bbbbbbbbbbbbbbbbb
aaaaaaaaaa es asignado en tiempo de ejecución;
BBBBBBBBBBBBBBBBBB se determina en tiempo de compilación;
Sin embargo, en accesos posteriores, las matrices en la pila son más rápidas que las cadenas apuntadas por punteros (como el montón).
Por ejemplo:
#Incluye
void main()
{
char a = 1;
char c[]= " 1234567890 ";
char * p = " 1234567890 ";
a = c[1]; p >a = p[1];
Retorno;
}
Código ensamblador correspondiente
10: a = c[1 ];
00401067 8A 4D f 1 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 primero lee los elementos de la cadena directamente al leer el Registro cl, el segundo lee el valor del puntero primero.
En edx, la lectura de caracteres según edx es obviamente lenta.
2.7 Resumen:
La diferencia entre montón y pila se puede ver a través de la siguiente metáfora:
Usar la pila es como comer en un restaurante, solo Necesitamos pedir comida (Aplicar), pagar, comer (usar) hasta llenarnos.
Ve y no te preocupes por los trabajos de preparación como cortar y lavar verduras y los trabajos de acabado como lavar platos y ollas. Su ventaja es que es rápido, pero desde
Usar montones es como cocinar tus propios platos favoritos. Es más problemático, pero está más acorde con tu propio gusto y es más gratuito.
Genial. (¡Clásico!)