Atmiņu C/C++/Java programmā var piešķirt stekā vai kaudzītē.
Priekšnosacījums: C programmas atmiņas izkārtojums .
Steka piešķiršana: Piešķiršana notiek blakus esošajos atmiņas blokos. Mēs to saucam par steka atmiņas piešķiršanu, jo piešķiršana notiek funkciju izsaukuma stekā. Piešķiramās atmiņas lielums ir zināms kompilatoram, un ikreiz, kad tiek izsaukta funkcija, tās mainīgie iegūst atmiņu, kas tiek piešķirta stekā. Un ikreiz, kad funkcijas izsaukums ir beidzies, mainīgo lielumu atmiņa tiek atdalīta. Tas viss notiek, izmantojot dažas iepriekš noteiktas rutīnas kompilatorā. Programmētājam nav jāuztraucas par atmiņas piešķiršanu un steka mainīgo lielumu atdalīšanu. Šāda veida atmiņas piešķiršana ir pazīstama arī kā pagaidu atmiņas piešķiršana, jo, tiklīdz metode beidz izpildi, visi šai metodei piederošie dati tiek automātiski izvadīti no steka. Tas nozīmē, ka jebkura steka atmiņas shēmā saglabātā vērtība ir pieejama, kamēr metode nav pabeigusi izpildi un pašlaik darbojas.
jpoga
Galvenie punkti:
- Tā ir pagaidu atmiņas piešķiršanas shēma, kurā datu dalībnieki ir pieejami tikai tad, ja pašlaik darbojas metode ( ), kas tos saturēja.
- Tas automātiski piešķir vai atceļ atmiņu, tiklīdz atbilstošā metode pabeidz tās izpildi.
- Mēs saņemam atbilstošo Java kļūdu. lang. StackOverFlowError autors JVM , Ja kaudzes atmiņa ir pilnībā piepildīta.
- Steka atmiņas piešķiršana tiek uzskatīta par drošāku, salīdzinot ar kaudzes atmiņas piešķiršanu, jo saglabātajiem datiem var piekļūt tikai īpašnieka pavediens.
- Atmiņas piešķiršana un atdalīšana ir ātrāka, salīdzinot ar kaudzes atmiņas piešķiršanu.
- Stack atmiņā ir mazāk vietas krātuvē, salīdzinot ar Heap-memory.
int main() { // All these variables get memory // allocated on stack int a; int b[10]; int n = 20; int c[n]; }>
Kaudzes piešķiršana: Atmiņa tiek piešķirta programmētāju rakstīto instrukciju izpildes laikā. Ņemiet vērā, ka nosaukuma kaudzītei nav nekā kopīga ar atmiņas noplūde var notikt programmā.
Kaudzes atmiņas piešķiršana ir sadalīta trīs kategorijās: - Šīs trīs kategorijas palīdz mums noteikt prioritāti datiem (objektiem), kas jāuzglabā kaudzes atmiņā vai Atkritumu kolekcija .
grima produktu nosaukums
- Jaunā paaudze - Tā ir atmiņas daļa, kurā tiek izveidoti visi jaunie dati (objekti), lai piešķirtu vietu, un ikreiz, kad šī atmiņa ir pilnībā aizpildīta, pārējie dati tiek glabāti atkritumu savākšanā.
- Vecā vai pastāvīgā paaudze - Šī ir Heap-memory daļa, kurā ir ievietoti vecāki datu objekti, kas netiek bieži izmantoti vai netiek izmantoti vispār.
- Pastāvīgā paaudze - Šī ir kaudzes atmiņas daļa, kurā ir JVM metadati izpildlaika klasēm un lietojumprogrammu metodēm.
Galvenie punkti:
- Mēs saņemam atbilstošu kļūdas ziņojumu, ja kaudzes vieta ir pilnībā pilna, java. lang.OutOfMemoryError autors JVM.
- Šī atmiņas piešķiršanas shēma atšķiras no steka vietas piešķiršanas, šeit netiek nodrošināta automātiskās atdalīšanas funkcija. Lai efektīvi izmantotu atmiņu, mums ir jāizmanto atkritumu savācējs, lai noņemtu vecos neizmantotos objektus.
- Šīs atmiņas apstrādes laiks (piekļuves laiks) ir diezgan lēns, salīdzinot ar steka atmiņu.
- Kaudzes atmiņa arī nav tik droša kā skursteņa atmiņa, jo kaudzes atmiņā saglabātie dati ir redzami visiem pavedieniem.
- Kaudzes atmiņas izmērs ir diezgan lielāks, salīdzinot ar kaudzes atmiņu.
- Kaudzes atmiņa ir pieejama vai pastāv tik ilgi, kamēr darbojas visa lietojumprogramma (vai Java programma).
int main() { // This memory for 10 integers // is allocated on heap. int *ptr = new int[10]; }>
Abu veidu atmiņas piešķiršanas Heap un Stack jaukts piemērs 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>
Tālāk ir sniegti secinājumi, kurus mēs izdarīsim pēc iepriekš minētā piemēra analīzes.
- Uzsākot have programmas izpildi, visas izpildlaika klases tiek glabātas Heap-memory telpā.
- Pēc tam mēs atrodam metodi main() nākamajā rindā, kas tiek saglabāta kaudzē kopā ar visu tās primitīvo (vai lokālo), un atsauces mainīgais Emp tipa Emp_detail arī tiks saglabāts kaudzē un norādīs uz atbilstošo objektu. saglabāts kaudzes atmiņā.
- Pēc tam nākamajā rindā tiks izsaukts parametrizētais konstruktors Emp(int, String) no main( ), un tas arī tiks piešķirts tā paša steka atmiņas bloka augšdaļai. Tas saglabās:
- Izsauktā steka atmiņas objekta objekta atsauce.
- Primitīvā vērtība ( Argumenta String emp_name atsauces mainīgais norādīs uz faktisko virkni no virkņu kopas kaudzes atmiņā.
- Pēc tam galvenā metode atkal izsauks statisko metodi Emp_detail (), kurai tiks veikta sadale steka atmiņas blokā virs iepriekšējā atmiņas bloka.
- Argumenta String emp_name atsauces mainīgais norādīs uz faktisko virkni no virkņu kopas kaudzes atmiņā.
Argumenta String emp_name atsauces mainīgais norādīs uz faktisko virkni no virkņu kopas kaudzes atmiņā.

1. att
kas ir mac os
Galvenās atšķirības starp kaudzes un kaudzes piešķiršanu
- Kaudzē piešķiršanu un atdalīšanu automātiski veic kompilators, savukārt kaudzes gadījumā programmētājam tas ir jādara manuāli.
- Apstrāde ar kaudzes rāmi ir dārgāka nekā skursteņa rāmja apstrāde.
- Atmiņas trūkuma problēma, visticamāk, rodas kaudzē, turpretim galvenā problēma kaudzes atmiņā ir sadrumstalotība.
- Piekļuve kaudzes kadram ir vienkāršāka nekā kaudzes kadram, jo stekam ir mazs atmiņas apgabals un tas ir draudzīgs kešatmiņai, taču kaudzes kadru gadījumā, kas ir izkliedēti visā atmiņā, tas izraisa vairāk kešatmiņas izlaidumu.
- Kaudze nav elastīga, piešķirto atmiņas lielumu nevar mainīt, savukārt kaudze ir elastīga, un piešķirto atmiņu var mainīt.
- Piekļuve kaudzes laikam ir vairāk nekā kaudze.
Salīdzināšanas diagramma
Parametrs | KAUDZE | KAUZE |
---|---|---|
Pamata | Atmiņa tiek piešķirta blakus esošajā blokā. | Atmiņa tiek piešķirta jebkurā nejaušā secībā. |
Piešķiršana un atdalīšana | Automātiski, izmantojot kompilatora instrukcijas. | Programmētāja rokasgrāmata. |
Izmaksas | Mazāk | Vairāk |
Īstenošana | Viegli | Grūti |
Piekļuves laiks | Ātrāk | Lēnāk |
Galvenā problēma | Atmiņas trūkums | Atmiņas sadrumstalotība |
Atsauces vieta | Lieliski | Adekvāta |
Drošība | Pavedienu drošs, saglabātajiem datiem var piekļūt tikai īpašnieks | Nav droša pavedienam, saglabātie dati ir redzami visiem pavedieniem |
Elastīgums | Fiksēta izmēra | Ir iespējama izmēra maiņa |
Datu tipu struktūra | Lineārs | Hierarhisks |
Vēlams | Masīvā priekšroka tiek dota statiskai atmiņas piešķiršanai. | Saistītajā sarakstā priekšroka tiek dota kaudzes atmiņas piešķiršanai. |
Izmērs | Mazāka nekā kaudzes atmiņa. | Lielāka nekā steka atmiņa. |