C/C++/Java programos atmintis gali būti paskirstyta krūvoje arba krūvoje.
Būtina sąlyga: C programos atminties išdėstymas .
Stacko paskirstymas: Paskirstymas vyksta gretimuose atminties blokuose. Mes tai vadiname kamino atminties paskirstymu, nes paskirstymas vyksta funkcijų iškvietimo krūvoje. Paskirstomos atminties dydis yra žinomas kompiliatoriui ir kiekvieną kartą, kai iškviečiama funkcija, jos kintamiesiems atmintis paskirstoma dėtuvėje. Ir kiekvieną kartą, kai baigiasi funkcijos iškvietimas, kintamiesiems skirta atmintis atimama. Visa tai vyksta naudojant kai kurias iš anksto nustatytas procedūras kompiliatoriuje. Programuotojas neturi jaudintis dėl atminties paskirstymo ir kamino kintamųjų paskirstymo. Toks atminties paskirstymas taip pat žinomas kaip laikinas atminties paskirstymas, nes kai tik metodas baigia vykdyti, visi šiam metodui priklausantys duomenys automatiškai pašalinami iš krūvos. Tai reiškia, kad bet kuri dėklo atminties schemoje saugoma vertė yra pasiekiama tol, kol metodas nebaigė vykdyti ir šiuo metu veikia.
yra baltyminiai riebalai
Pagrindiniai klausimai:
- Tai laikina atminties paskirstymo schema, kai duomenų nariai pasiekiami tik tuo atveju, jei šiuo metu veikia metodas ( ), kuriame jie buvo.
- Jis automatiškai paskirsto atmintį arba panaikina jos paskirstymą, kai tik atitinkamas metodas baigia vykdyti.
- Gauname atitinkamą „Java“ klaidą. lang. StackOverFlowError pateikė JVM , Jei kamino atmintis pilnai užpildyta.
- Stacko atminties paskirstymas laikomas saugesniu, palyginti su krūvos atminties paskirstymu, nes saugomus duomenis gali pasiekti tik savininko gija.
- Atminties paskirstymas ir paskirstymas yra greitesnis, palyginti su krūvos atminties paskirstymu.
- Stack atmintis turi mažiau vietos saugykloje, palyginti su Heap-memory.
int main() { // All these variables get memory // allocated on stack int a; int b[10]; int n = 20; int c[n]; }>
Krūvos paskirstymas: Atmintis paskirstoma vykdant programuotojų parašytas instrukcijas. Atminkite, kad pavadinimo krūva neturi nieko bendra su atminties nutekėjimas gali atsitikti programoje.
Krūvos atminties paskirstymas dar skirstomas į tris kategorijas: Šios trys kategorijos padeda mums nustatyti pirmenybę duomenims (objektams), kurie turi būti saugomi krūvos atmintyje arba Šiukšlių kolekcija .
prasideda java
- Jaunoji karta - Tai yra atminties dalis, kurioje visi nauji duomenys (objektai) yra skirti vietai paskirstyti, o kai ši atmintis visiškai užpildoma, likusieji duomenys saugomi šiukšlių rinkinyje.
- Senoji arba nuolatinė karta – Tai yra Heap-memory dalis, kurioje yra senesni duomenų objektai, kurie nėra dažnai naudojami arba visai nenaudojami.
- Nuolatinė karta – Tai yra „Heap-memory“ dalis, kurioje yra JVM metaduomenys, skirti vykdymo laiko klasėms ir taikymo metodams.
Pagrindiniai klausimai:
- Gauname atitinkamą klaidos pranešimą, jei Heap-space yra visiškai pilnas, java. lang.OutOfMemoryError pateikė JVM.
- Ši atminties paskirstymo schema skiriasi nuo kamino vietos paskirstymo, čia nėra automatinio paskirstymo funkcijos. Norėdami efektyviai naudoti atmintį, turime naudoti šiukšlių rinktuvą, kad pašalintume senus nenaudojamus objektus.
- Šios atminties apdorojimo laikas (prieigos laikas) yra gana lėtas, palyginti su „Stack“ atmintimi.
- Krūvos atmintis taip pat nėra tokia saugi kaip stulpelio atmintis, nes krūvos atmintyje saugomus duomenis mato visos gijos.
- „Heap“ atminties dydis yra gana didesnis, palyginti su „Stack“ atmintimi.
- Krūvos atmintis pasiekiama arba egzistuoja tol, kol veikia visa programa (arba „Java“ programa).
int main() { // This memory for 10 integers // is allocated on heap. int *ptr = new int[10]; }>
Mišrus abiejų tipų atminties paskirstymo „Heap“ ir „Stack“ pavyzdys „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>
Toliau pateikiamos išvados, kurias padarysime išanalizavę aukščiau pateiktą pavyzdį:
paieškos sistema ir pavyzdžiai
- Kai pradedame vykdyti programą, visos vykdymo klasės yra saugomos Heap-memory erdvėje.
- Tada kitoje eilutėje rasime metodą main(), kuris yra saugomas krūvoje kartu su visu jo primityvu (arba vietiniu), o atskaitos kintamasis Emp, kurio tipas yra Emp_detail, taip pat bus saugomas dėtuvėje ir nukreips į atitinkamą objektą. saugomi krūvos atmintyje.
- Tada kitoje eilutėje bus iškviestas parametrizuotas konstruktorius Emp(int, String) iš main( ) ir taip pat bus priskirtas to paties kamino atminties bloko viršuje. Tai saugos:
- Iškviesto kamino atminties objekto nuoroda.
- Primityvi reikšmė ( Argumento String emp_name nuorodos kintamasis nurodys faktinę eilutę iš eilučių telkinio į krūvos atmintį.
- Tada pagrindinis metodas vėl iškvies statinį metodą Emp_detail (), kuris bus paskirstytas dėklo atminties bloke, esančiame ant ankstesnio atminties bloko.
- Argumento String emp_name nuorodos kintamasis nurodys faktinę eilutę iš eilučių telkinio į krūvos atmintį.
Argumento String emp_name nuorodos kintamasis nurodys faktinę eilutę iš eilučių telkinio į krūvos atmintį.

1 pav
Pagrindiniai kamino ir krūvos paskirstymo skirtumai
- Kiemelyje paskirstymą ir paskirstymą automatiškai atlieka kompiliatorius, o krūvoje tai turi atlikti programuotojas rankiniu būdu.
- Krūvos rėmo tvarkymas yra brangesnis nei krūvos rėmo tvarkymas.
- Labiau tikėtina, kad atminties trūkumo problema įvyks krūvoje, o pagrindinė krūvos atminties problema yra susiskaidymas.
- Prieiga prie krūvos kadrų yra lengvesnė nei krūvos kadro, nes dėklas turi nedidelę atminties sritį ir yra draugiškas talpyklai, tačiau jei krūvos kadrai yra išsklaidyti po visą atmintį, tai sukelia daugiau talpyklos praleidimų.
- Stackas nėra lankstus, paskirto atminties dydžio pakeisti negalima, o krūva yra lanksti, o paskirtą atmintį galima keisti.
- Prieiga prie krūvos laiko yra daugiau nei krūva.
Palyginimo diagrama
Parametras | STAKE | KŪNAS |
---|---|---|
Pagrindinis | Atmintis paskirstoma gretimame bloke. | Atmintis paskirstoma bet kokia atsitiktine tvarka. |
Paskirstymas ir paskirstymas | Automatiškai pagal kompiliatoriaus instrukcijas. | Programuotojo vadovas. |
Kaina | Mažiau | Daugiau |
Įgyvendinimas | Lengva | Sunku |
Prieigos laikas | Greičiau | Lėčiau |
Pagrindinė problema | Atminties trūkumas | Atminties fragmentacija |
Nuorodos vieta | Puikiai | Pakankamas |
Saugumas | Saugus, saugomus duomenis gali pasiekti tik savininkas | Neapsaugota gijos, saugomi duomenys matomi visoms gijomis |
Lankstumas | Fiksuoto dydžio | Galimas dydžio keitimas |
Duomenų tipo struktūra | Linijinis | Hierarchinis |
Pageidautina | Masyve pirmenybė teikiama statiniam atminties paskirstymui. | Susietame sąraše pirmenybė teikiama krūvos atminties paskirstymui. |
Dydis | Maža nei krūva atmintis. | Didesnė nei kamino atmintis. |