Hukommelse i et C/C++/Java-program kan enten allokeres på en stak eller en heap.
Forudsætning: Hukommelseslayout af C-program .
Staktildeling: Tildelingen sker på sammenhængende hukommelsesblokke. Vi kalder det en stackhukommelsesallokering, fordi allokeringen sker i funktionsopkaldsstakken. Størrelsen på den hukommelse, der skal tildeles, er kendt af compileren, og hver gang en funktion kaldes, får dens variabler hukommelse allokeret på stakken. Og når funktionskaldet er forbi, deallokeres hukommelsen til variablerne. Alt dette sker ved hjælp af nogle foruddefinerede rutiner i compileren. En programmør behøver ikke at bekymre sig om hukommelsesallokering og deallokering af stakvariabler. Denne form for hukommelsesallokering er også kendt som Midlertidig hukommelsesallokering, fordi så snart metoden afslutter sin udførelse, skylles alle data, der hører til den metode, automatisk ud af stakken. Dette betyder, at enhver værdi, der er gemt i stackhukommelsesskemaet, er tilgængelig, så længe metoden ikke har fuldført sin eksekvering og i øjeblikket kører.
java streng tilføje
Centrale punkter:
- Det er en midlertidig hukommelsesallokeringsordning, hvor datamedlemmerne kun er tilgængelige, hvis metoden ( ), der indeholdt dem, kører i øjeblikket.
- Den allokerer eller deallokerer hukommelsen automatisk, så snart den tilsvarende metode fuldfører sin udførelse.
- Vi modtager den tilsvarende fejl Java. lang. StackOverFlowError ved JVM , Hvis stakhukommelsen er fyldt helt.
- Stack memory allokering anses for at være mere sikker sammenlignet med heap memory allokering, fordi de lagrede data kun kan tilgås af ejertråden.
- Hukommelsesallokering og -deallokering er hurtigere sammenlignet med Heap-memory-allokering.
- Stack-hukommelse har mindre lagerplads sammenlignet med Heap-hukommelse.
int main() { // All these variables get memory // allocated on stack int a; int b[10]; int n = 20; int c[n]; }>
Heap-allokering: Hukommelsen tildeles under udførelsen af instruktioner skrevet af programmører. Bemærk, at navnebunken ikke har noget at gøre med hukommelsestab kan ske i programmet.
Heap-memory-allokeringen er yderligere opdelt i tre kategorier:- Disse tre kategorier hjælper os med at prioritere de data(objekter), der skal lagres i heap-hukommelsen eller i Dagrenovation .
mysql ændre kolonnetype
- Ung generation – Det er den del af hukommelsen, hvor alle de nye data(objekter) er lavet til at allokere pladsen, og hver gang denne hukommelse er helt fyldt, så lagres resten af dataene i Garbage Collection.
- Gammel eller fastansat generation – Dette er den del af Heap-memory, der indeholder de ældre dataobjekter, som ikke er i hyppig brug eller slet ikke er i brug, er placeret.
- Permanent generation – Dette er den del af Heap-memory, der indeholder JVM's metadata for runtime-klasserne og applikationsmetoderne.
Centrale punkter:
- Vi modtager den tilsvarende fejlmeddelelse, hvis Heap-space er helt fyldt, java. lang.OutOfMemoryError af JVM.
- Dette hukommelsestildelingsskema er forskelligt fra Stack-space-allokeringen, her er der ingen automatisk de-allokeringsfunktion. Vi skal bruge en skraldeopsamler til at fjerne de gamle ubrugte genstande for at kunne bruge hukommelsen effektivt.
- Behandlingstiden (adgangstiden) for denne hukommelse er ret langsom sammenlignet med Stack-memory.
- Heap-hukommelse er heller ikke så threaded-sikker som Stack-memory, fordi data gemt i Heap-memory er synlige for alle tråde.
- Størrelsen af Heap-hukommelsen er ret større sammenlignet med Stack-hukommelsen.
- Heap-hukommelse er tilgængelig eller eksisterer, så længe hele applikationen (eller java-programmet) kører.
int main() { // This memory for 10 integers // is allocated on heap. int *ptr = new int[10]; }> Blandet eksempel på begge slags hukommelsesallokering Heap og Stack i 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> Følgende er de konklusioner, som vi vil drage efter at have analyseret ovenstående eksempel:
række af strenge i c-programmering
- Når vi starter udførelse af have-programmet, gemmes alle køretidsklasserne i Heap-memory-rummet.
- Så finder vi main() metoden i næste linje, som er gemt i stakken sammen med alle dens primitive(eller lokale) og referencevariablen Emp af typen Emp_detail vil også blive gemt i stakken og vil pege ud til det tilsvarende objekt gemt i Heap-hukommelsen.
- Derefter vil den næste linje kalde til den parameteriserede konstruktør Emp(int, String) fra main( ), og den vil også allokere til toppen af den samme stakhukommelsesblok. Dette vil gemme:
- Objektreferencen for det påkaldte objekt i stakhukommelsen.
- Den primitive værdi( Referencevariablen for String emp_name-argumentet vil pege på den faktiske streng fra strengpuljen ind i heap-hukommelsen.
- Derefter vil hovedmetoden igen kalde til den statiske Emp_detail()-metode, for hvilken allokering vil blive foretaget i stakhukommelsesblok oven på den forrige hukommelsesblok.
- Referencevariablen for String emp_name-argumentet vil pege på den faktiske streng fra strengpuljen ind i heap-hukommelsen.
Referencevariablen for String emp_name-argumentet vil pege på den faktiske streng fra strengpuljen ind i heap-hukommelsen.

Fig.1
Nøgleforskelle mellem stak- og heap-allokeringer
- I en stack udføres tildelingen og de-allokeringen automatisk af compileren, mens det i heap skal udføres af programmøren manuelt.
- Håndtering af Heap-rammen er dyrere end håndtering af stakrammen.
- Problem med hukommelsesmangel er mere tilbøjelige til at ske i stakken, mens hovedproblemet i heap-hukommelse er fragmentering.
- Stack frame-adgang er nemmere end heap-rammen, da stakken har et lille hukommelsesområde og er cache-venligt, men i tilfælde af heap-rammer, som er spredt i hele hukommelsen, så det forårsager flere cache-misser.
- En stak er ikke fleksibel, den tildelte hukommelsesstørrelse kan ikke ændres, hvorimod en heap er fleksibel, og den tildelte hukommelse kan ændres.
- Adgang til tiden for heap tager er mere end en stak.
Sammenligningsskema
| Parameter | STAK | HUNGE |
|---|---|---|
| Grundlæggende | Hukommelse er allokeret i en sammenhængende blok. | Hukommelsen tildeles i enhver tilfældig rækkefølge. |
| Allokering og De-allokering | Automatisk ved compiler instruktioner. | Manual af programmøren. |
| Koste | Mindre | Mere |
| Implementering | Let | Hårdt |
| Adgangstid | Hurtigere | Langsommere |
| Hovednummer | Mangel på hukommelse | Hukommelsesfragmentering |
| Referencested | Fremragende | Tilstrækkelig |
| Sikkerhed | Trådsikker, lagrede data kan kun tilgås af ejeren | Ikke trådsikker, data gemt er synlige for alle tråde |
| Fleksibilitet | Fast størrelse | Det er muligt at ændre størrelse |
| Datatypestruktur | Lineær | Hierarkisk |
| Foretrukken | Statisk hukommelsesallokering foretrækkes i et array. | Heap-hukommelsesallokering foretrækkes i den sammenkædede liste. |
| Størrelse | Small than heap hukommelse. | Større end stakhukommelse. |