La memòria en un programa C/C++/Java es pot assignar en una pila o en un munt.
Requisit previ: Disseny de memòria del programa C .
Assignació de pila: L'assignació es fa en blocs de memòria contigus. L'anomenem assignació de memòria de pila perquè l'assignació es produeix a la pila de trucades de funció. La mida de la memòria que s'ha d'assignar és coneguda pel compilador i cada vegada que es crida una funció, les seves variables obtenen memòria assignada a la pila. I sempre que s'acaba la trucada de funció, la memòria de les variables es desassigna. Tot això passa utilitzant algunes rutines predefinides al compilador. Un programador no s'ha de preocupar per l'assignació de memòria i la desassignació de variables de pila. Aquest tipus d'assignació de memòria també es coneix com a assignació de memòria temporal perquè tan bon punt el mètode acaba d'executar-se totes les dades que pertanyen a aquest mètode s'eliminen de la pila automàticament. Això significa que qualsevol valor emmagatzemat a l'esquema de memòria de pila és accessible sempre que el mètode no hagi completat la seva execució i estigui actualment en execució.
concatenar una cadena java
Punts clau:
- És un esquema d'assignació de memòria temporal on els membres de dades només són accessibles si el mètode ( ) que els contenia s'està executant actualment.
- Assigna o desassigna la memòria automàticament tan bon punt el mètode corresponent completa la seva execució.
- Rebem l'error Java corresponent. lang. StackOverFlowError per JVM , Si la memòria de pila s'omple completament.
- L'assignació de memòria de pila es considera més segura en comparació amb l'assignació de memòria de pila perquè només es pot accedir a les dades emmagatzemades pel fil propietari.
- L'assignació i la desassignació de memòria són més ràpides en comparació amb l'assignació de memòria Heap.
- La memòria de pila té menys espai d'emmagatzematge en comparació amb la memòria Heap.
int main() { // All these variables get memory // allocated on stack int a; int b[10]; int n = 20; int c[n]; }>
Assignació d'heap: La memòria s'assigna durant l'execució d'instruccions escrites pels programadors. Tingueu en compte que el nom munt no té res a veure amb pèrdua de memòria pot passar al programa.
L'assignació de memòria heap es divideix a més en tres categories: Aquestes tres categories ens ajuden a prioritzar les dades (Objectes) a emmagatzemar a la memòria Heap o al Recollida d'escombraries .
càlcul de la tinença en excel
- generació jove - És la part de la memòria on es fan totes les dades noves (objectes) per assignar l'espai i sempre que aquesta memòria s'omple completament, la resta de dades s'emmagatzemen a la recollida d'escombraries.
- Generació antiga o titular - Aquesta és la part de la memòria Heap que conté els objectes de dades més antics que no s'utilitzen freqüentment o que no s'utilitzen en absolut.
- Generació permanent - Aquesta és la part de la memòria Heap que conté les metadades de la JVM per a les classes d'execució i els mètodes d'aplicació.
Punts clau:
- Rebem el missatge d'error corresponent si l'espai heap està completament ple, java. lang.OutOfMemoryError per JVM.
- Aquest esquema d'assignació de memòria és diferent de l'assignació d'espai de pila, aquí no es proporciona cap funció de desassignació automàtica. Hem d'utilitzar un col·lector d'escombraries per eliminar els objectes antics no utilitzats per tal d'utilitzar la memòria de manera eficient.
- El temps de processament (temps d'accés) d'aquesta memòria és bastant lent en comparació amb la memòria de pila.
- La memòria heap tampoc és tan segura per a fils com la memòria de pila perquè les dades emmagatzemades a la memòria heap són visibles per a tots els fils.
- La mida de la memòria Heap és bastant més gran en comparació amb la memòria Stack.
- La memòria de pila és accessible o existeix mentre s'executi tota l'aplicació (o programa java).
int main() { // This memory for 10 integers // is allocated on heap. int *ptr = new int[10]; }> Exemple mixt d'ambdós tipus d'assignació de memòria Heap i Stack a Java:
C++
#include using namespace std; int main() { int a = 10; // stored in stack int* p = new int(); // allocate memory in heap *p = 10; delete (p); p = new int[4]; // array in heap allocation delete[] p; p = NULL; // free heap return 0; }> Java class Emp { int id; String emp_name; public Emp(int id, String emp_name) { this.id = id; this.emp_name = emp_name; } } public class Emp_detail { private static Emp Emp_detail(int id, String emp_name) { return new Emp(id, emp_name); } public static void main(String[] args) { int id = 21; String name = 'Maddy'; Emp person_ = null; person_ = Emp_detail(id, name); } }> Python def main(): a = 10 # stored in stack p = None # declaring p variable p = 10 # allocating memory in heap del p # deleting memory allocation in heap p = [None] * 4 # array in heap allocation p = None # free heap return 0 if __name__ == '__main__': main()>
Javascript // Define the Emp class with id and emp_name properties class Emp { constructor(id, emp_name) { this.id = id; // Initialize id this.emp_name = emp_name; // Initialize emp_name } } // Create an instance of the Emp class const person = new Emp(21, 'Maddy'); // Initialize person with id 21 and emp_name 'Maddy' console.log(person); // Output the person object to the console> A continuació es mostren les conclusions a les quals traurem després d'analitzar l'exemple anterior:
setinterval javascript
- Quan comencem a executar el programa have, totes les classes en temps d'execució s'emmagatzemen a l'espai de memòria Heap.
- Aleshores trobem el mètode main() a la línia següent que s'emmagatzema a la pila juntament amb tota la seva primitiva (o local) i la variable de referència Emp de tipus Emp_detail també s'emmagatzemarà a la pila i assenyalarà l'objecte corresponent. emmagatzemat a la memòria Heap.
- A continuació, la línia següent cridarà al constructor parametritzat Emp(int, String) des de main() i també s'assignarà a la part superior del mateix bloc de memòria de pila. Això emmagatzemarà:
- La referència d'objecte de l'objecte invocat de la memòria de pila.
- El valor primitiu ( La variable de referència de l'argument String emp_name apuntarà a la cadena real de l'agrupació de cadenes a la memòria de pila.
- Aleshores, el mètode principal tornarà a cridar al mètode estàtic Emp_detail(), per al qual l'assignació es farà al bloc de memòria de pila a sobre del bloc de memòria anterior.
- La variable de referència de l'argument String emp_name apuntarà a la cadena real de l'agrupació de cadenes a la memòria de pila.
La variable de referència de l'argument String emp_name apuntarà a la cadena real de l'agrupació de cadenes a la memòria de pila.

Fig.1
Diferències clau entre les assignacions de pila i pila
- En una pila, l'assignació i la desassignació les fa automàticament el compilador, mentre que, a l'emmagatzematge, l'ha de fer el programador manualment.
- La manipulació del marc Heap és més costós que la manipulació del marc de la pila.
- És més probable que el problema d'escassetat de memòria succeeixi a la pila, mentre que el problema principal de la memòria del munt és la fragmentació.
- L'accés al marc de pila és més fàcil que el marc de pila ja que la pila té una petita regió de memòria i és amigable amb la memòria cau, però en el cas dels marcs de pila que es troben dispersos per la memòria, provoca més errors de memòria cau.
- Una pila no és flexible, la mida de memòria assignada no es pot canviar, mentre que una pila és flexible i la memòria assignada es pot alterar.
- Accedir al temps de la pila és més que una pila.
Quadre de comparació
| Paràmetre | PILA | MUNT |
|---|---|---|
| Bàsic | La memòria s'assigna en un bloc contigu. | La memòria s'assigna en qualsevol ordre aleatori. |
| Assignació i desassignació | Automàtic mitjançant instruccions del compilador. | Manual del programador. |
| Cost | Menys | Més |
| Implementació | Fàcil | Dur |
| Temps d'accés | Més ràpid | Més lent |
| Tema principal | Falta de memòria | Fragmentació de la memòria |
| Localitat de referència | Excel · lent | Adequat |
| Seguretat | Fil segur, les dades emmagatzemades només poden accedir al propietari | No és segur per a fils, les dades emmagatzemades són visibles per a tots els fils |
| Flexibilitat | De mida fixa | El canvi de mida és possible |
| Estructura de tipus de dades | Lineal | Jeràrquic |
| Preferent | Es prefereix l'assignació de memòria estàtica en una matriu. | Es prefereix l'assignació de memòria de pila a la llista enllaçada. |
| Mida | Petit que la memòria del munt. | Més gran que la memòria de pila. |