Pomnilnik v programu C/C++/Java je lahko dodeljen skladu ali kupu.
Predpogoj: Postavitev pomnilnika programa C .
Dodelitev sklada: Dodelitev poteka na sosednjih blokih pomnilnika. Temu pravimo dodelitev pomnilnika sklada, ker se dodelitev zgodi v skladu klicev funkcij. Velikost pomnilnika, ki ga je treba dodeliti, je znana prevajalniku in vsakič, ko je funkcija poklicana, se njenim spremenljivkam dodeli pomnilnik v skladu. In kadar koli je klic funkcije končan, se pomnilnik za spremenljivke sprosti. Vse to se zgodi z uporabo nekaterih vnaprej določenih rutin v prevajalniku. Programerju ni treba skrbeti za dodeljevanje pomnilnika in de-dodeljevanje spremenljivk sklada. Ta vrsta dodelitve pomnilnika je znana tudi kot začasna dodelitev pomnilnika, ker se takoj, ko metoda konča z izvajanjem, vsi podatki, ki pripadajo tej metodi, samodejno izplaknejo iz sklada. To pomeni, da je vsaka vrednost, shranjena v pomnilniški shemi sklada, dostopna, dokler metoda ni dokončala svoje izvedbe in je trenutno v stanju izvajanja.
meni z nastavitvami android
Ključne točke:
- To je začasna shema dodeljevanja pomnilnika, kjer so podatkovni člani dostopni samo, če se metoda(), ki jih je vsebovala, trenutno izvaja.
- Samodejno dodeli ali odstrani pomnilnik takoj, ko ustrezna metoda zaključi svojo izvedbo.
- Prejmemo ustrezno napako Java. jezik StackOverFlowError avtor JVM , Če je pomnilnik sklada popolnoma zapolnjen.
- Dodeljevanje pomnilnika sklada velja za varnejšega v primerjavi z dodeljevanjem pomnilnika kopice, ker lahko do shranjenih podatkov dostopa samo nit lastnika.
- Dodeljevanje in odstranjevanje pomnilnika sta hitrejša v primerjavi z dodeljevanjem pomnilnika kopice.
- Pomnilnik sklada ima manj prostora za shranjevanje v primerjavi s pomnilnikom kopice.
int main() { // All these variables get memory // allocated on stack int a; int b[10]; int n = 20; int c[n]; }>
Dodelitev kopice: Pomnilnik se dodeli med izvajanjem navodil, ki jih napišejo programerji. Upoštevajte, da kopica imen nima nobene zveze z puščanje pomnilnika se lahko zgodi v programu.
Dodelitev pomnilnika kopice je nadalje razdeljena v tri kategorije: - Te tri kategorije nam pomagajo določiti prednost podatkov (predmetov), ki bodo shranjeni v pomnilniku kopice ali v Odvoz smeti .
java niz v json
- Mlada generacija – To je del pomnilnika, kjer so vsi novi podatki (objekti) narejeni za dodelitev prostora in kadar koli je ta pomnilnik v celoti zapolnjen, se preostali podatki shranijo v zbiralnik smeti.
- Stara ali starejša generacija – To je del pomnilnika kopice, ki vsebuje starejše podatkovne objekte, ki se ne uporabljajo pogosto ali sploh niso v uporabi.
- Stalna generacija – To je del pomnilnika kopice, ki vsebuje metapodatke JVM za izvajalne razrede in metode aplikacij.
Ključne točke:
- Če je prostor kopice popolnoma poln, prejmemo ustrezno sporočilo o napaki, java. lang.OutOfMemoryError avtor JVM.
- Ta shema dodeljevanja pomnilnika se razlikuje od dodeljevanja prostora sklada, tukaj ni na voljo funkcija samodejne odstranitve. Za učinkovito uporabo pomnilnika moramo uporabiti zbiralnik smeti, da odstranimo stare neuporabljene predmete.
- Čas obdelave (čas dostopa) tega pomnilnika je precej počasen v primerjavi s pomnilnikom sklada.
- Pomnilnik kopice tudi ni tako varen glede niti kot pomnilnik sklada, ker so podatki, shranjeni v pomnilniku kopice, vidni vsem nitim.
- Velikost pomnilnika kopice je precej večja v primerjavi s pomnilnikom sklada.
- Pomnilnik kopice je dostopen ali obstaja, dokler teče celotna aplikacija (ali program java).
int main() { // This memory for 10 integers // is allocated on heap. int *ptr = new int[10]; }>
Mešani primer obeh vrst dodeljevanja pomnilnika Heap in Stack v Javi:
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>
Sledijo sklepi, ki jih bomo naredili po analizi zgornjega primera:
javascript operaterji
- Ko začnemo z izvajanjem programa have, so vsi razredi izvajalnega časa shranjeni v pomnilniški prostor kopice.
- Nato najdemo metodo main() v naslednji vrstici, ki je shranjena v skladu skupaj z vsemi svojimi primitivnimi (ali lokalnimi) in referenčna spremenljivka Emp tipa Emp_detail bo prav tako shranjena v skladu in bo kazala na ustrezen objekt shranjeno v pomnilniku kopice.
- Nato bo naslednja vrstica poklicala parametrizirani konstruktor Emp(int, String) iz main() in bo prav tako dodelila vrhu istega pomnilniškega bloka sklada. To bo shranilo:
- Referenca objekta klicanega objekta pomnilnika sklada.
- Primitivna vrednost ( Referenčna spremenljivka argumenta String emp_name bo kazala na dejanski niz iz skupine nizov v pomnilnik kopice.
- Nato bo glavna metoda ponovno poklicala statično metodo Emp_detail(), za katero bo dodeljena pomnilniška enota sklada na vrhu prejšnjega pomnilniškega bloka.
- Referenčna spremenljivka argumenta String emp_name bo kazala na dejanski niz iz skupine nizov v pomnilnik kopice.
Referenčna spremenljivka argumenta String emp_name bo kazala na dejanski niz iz skupine nizov v pomnilnik kopice.

Slika 1
Ključne razlike med dodelitvijo sklada in kopice
- V skladu dodelitev in odstranitev dodelitve samodejno izvede prevajalnik, medtem ko mora v kopici to ročno izvesti programer.
- Ravnanje z okvirjem kopice je dražje kot ravnanje z okvirjem sklada.
- Težava s pomanjkanjem pomnilnika se bolj verjetno pojavi v skladu, medtem ko je glavna težava v kopičnem pomnilniku fragmentacija.
- Dostop do okvirja sklada je lažji kot do okvira kopice, saj ima sklad majhno območje pomnilnika in je prijazen do predpomnilnika, vendar v primeru okvirjev kopice, ki so razpršeni po celotnem pomnilniku, povzroča več zgrešenj predpomnilnika.
- Sklad ni prilagodljiv, dodeljene velikosti pomnilnika ni mogoče spremeniti, medtem ko je kopica prilagodljiva in dodeljeni pomnilnik je mogoče spremeniti.
- Dostop do kopice traja več kot kup.
Primerjalna tabela
Parameter | STAK | HEAP |
---|---|---|
Osnovno | Pomnilnik je dodeljen v sosednjem bloku. | Pomnilnik se dodeli v poljubnem naključnem vrstnem redu. |
Dodelitev in dealokacija | Samodejno po navodilih prevajalnika. | Priročnik programerja. |
Stroški | Manj | več |
Izvedba | enostavno | težko |
Čas dostopa | Hitreje | Počasneje |
Glavna zadeva | Pomanjkanje spomina | Razdrobljenost spomina |
Referenčni kraj | Odlično | Ustrezno |
Varnost | Nitno varno, do shranjenih podatkov lahko dostopa samo lastnik | Ni varno za niti, shranjeni podatki so vidni vsem nitim |
Prilagodljivost | Fiksna velikost | Spreminjanje velikosti je možno |
Struktura podatkovnega tipa | Linearno | Hierarhično |
Prednostno | V matriki je prednostna dodelitev statičnega pomnilnika. | Na povezanem seznamu je prednostna dodelitev pomnilnika kopice. |
Velikost | Majhen kot kopica pomnilnika. | Večji od pomnilnika sklada. |