logo

Dodeljevanje pomnilnika sklada proti kopici

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.
C++
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).
CPP
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.
  • Torej bodo za novo ustvarjeni objekt Emp tipa Emp_detail in vse spremenljivke primerka shranjene v pomnilniku kopice.
  • Referenčna spremenljivka argumenta String emp_name bo kazala na dejanski niz iz skupine nizov v pomnilnik kopice.

  • Slikovni prikaz, kot je prikazano na sliki 1 spodaj:

    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

    1. V skladu dodelitev in odstranitev dodelitve samodejno izvede prevajalnik, medtem ko mora v kopici to ročno izvesti programer.
    2. Ravnanje z okvirjem kopice je dražje kot ravnanje z okvirjem sklada.
    3. Težava s pomanjkanjem pomnilnika se bolj verjetno pojavi v skladu, medtem ko je glavna težava v kopičnem pomnilniku fragmentacija.
    4. 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.
    5. Sklad ni prilagodljiv, dodeljene velikosti pomnilnika ni mogoče spremeniti, medtem ko je kopica prilagodljiva in dodeljeni pomnilnik je mogoče spremeniti.
    6. Dostop do kopice traja več kot kup.

    Primerjalna tabela

    ParameterSTAKHEAP
    OsnovnoPomnilnik je dodeljen v sosednjem bloku.Pomnilnik se dodeli v poljubnem naključnem vrstnem redu.
    Dodelitev in dealokacijaSamodejno po navodilih prevajalnika.Priročnik programerja.
    StroškiManjveč
    Izvedbaenostavnotežko
    Čas dostopaHitrejePočasneje
    Glavna zadevaPomanjkanje spominaRazdrobljenost spomina
    Referenčni krajOdličnoUstrezno
    VarnostNitno varno, do shranjenih podatkov lahko dostopa samo lastnikNi varno za niti, shranjeni podatki so vidni vsem nitim
    PrilagodljivostFiksna velikostSpreminjanje velikosti je možno
    Struktura podatkovnega tipaLinearnoHierarhično
    PrednostnoV matriki je prednostna dodelitev statičnega pomnilnika.Na povezanem seznamu je prednostna dodelitev pomnilnika kopice.
    VelikostMajhen kot kopica pomnilnika.Večji od pomnilnika sklada.