border=0

"77.95.5.4 - 77.95.5.4"

Wat en waar zijn de stapel en de hoop?

Boeken in programmeertalen leggen uit dat er waardetypen worden gemaakt op de stapel en dat er verwijzingscodes worden gemaakt op de hoop , zonder uit te leggen wat deze twee dingen zijn. Ik heb hier geen duidelijke verklaring voor gelezen. Ik begrijp wat een stapel is. echter,

  • waar en wat zijn ze (fysiek in echt computergeheugen)?
  • In welke mate worden ze bestuurd door het besturingssysteem of de taal?
  • Wat is hun volume?
  • Wat bepaalt de grootte van elk van hen?
  • Wat maakt het sneller?
7380
17 сент. zet mattshane 17 september neer . 2008-09-17 07:18 '08 om 07:18 uur 2008-09-17 07:18 uur
@ 25 antwoorden

Een stapel is een geheugen dat is gereserveerd als kladruimte voor een thread van uitvoering. Wanneer een functie wordt aangeroepen, wordt het blok boven aan de stapel gereserveerd voor lokale variabelen en enkele inloggegevens. Wanneer deze functie terugkeert, wordt het blok ongebruikt en kan het de volgende keer dat de functie wordt aangeroepen, worden gebruikt. De stapel is altijd gereserveerd in de volgorde LIFO (de laatste in de eerste volgorde); het meest recente gereserveerde blok is altijd het volgende blok dat moet worden vrijgegeven. Dit maakt het gemakkelijker om de stapel te volgen; het vrijgeven van een blok uit de stapel is niets meer dan een enkele aanwijzeraanpassing.

Een heap is een geheugen dat is toegewezen voor dynamische toewijzing. In tegenstelling tot de stapel is er geen gedwongen sjabloon voor het toewijzen en vrijmaken van blokken van een stapel; U kunt op elk moment een blok selecteren en deze op elk gewenst moment vrijgeven. Dit maakt het erg moeilijk om te volgen welke delen van de hoop op elk moment worden verdeeld of bevrijd; Er zijn veel aangepaste cum-distributeurs voor het afstemmen van heap-prestaties voor verschillende gebruikspatronen.

Elke thread ontvangt een stapel, terwijl voor een toepassing meestal maar één heap wordt gebruikt (hoewel het niet ongewoon is om verschillende heaps te hebben voor verschillende soorten toewijzingen).

Om uw vragen rechtstreeks te beantwoorden:

In welke mate worden ze bestuurd door het besturingssysteem of de taal?

Het besturingssysteem wijst een stapel toe voor elke thread op systeemniveau bij het maken van een thread. Doorgaans wordt het besturingssysteem opgeroepen door de taaluitvoeringsomgeving om een ​​heap voor een toepassing toe te wijzen.

Wat is hun volume?

De stapel is aan de draad bevestigd, dus wanneer de draad uit de stapel komt, wordt deze gecorrigeerd. Een heap wordt meestal toegewezen wanneer de toepassing tijdens runtime wordt uitgevoerd en terugkeert nadat de toepassing (technisch proces) is afgesloten.

Wat bepaalt de grootte van elk van hen?

De stackgrootte wordt ingesteld bij het maken van een thread. De heapgrootte wordt ingesteld wanneer de toepassing wordt gestart, maar kan indien nodig toenemen (de toewijzer vraagt ​​meer geheugen van het besturingssysteem).

Wat maakt het sneller?

De stapel is sneller omdat het toegangspatroon het triviaal maakt om geheugen toe te wijzen en vrij te maken (de aanwijzer / integer groeit gewoon of krimpt), en de heap heeft veel gecompliceerdere financiële overzichten met betrekking tot toewijzing of vrijgeving. Bovendien wordt elke byte in de stapel vaak opnieuw gebruikt, wat betekent dat deze meestal in de cache van de processor wordt weergegeven, waardoor deze erg snel is. Een andere happrestatiehit is dat de heap, die hoofdzakelijk een globale bron is, typisch multi-threaded, d.w.z. Elke distributie en release moet in de regel worden gesynchroniseerd met 'alle' andere heap-oproepen in het programma.

Duidelijke demonstratie: 2019

5436
17 сент. Het antwoord is gegeven door Jeff Hill 17 september. 2008-09-17 07:52 '08 om 7:52 uur 2008-09-17 07:52

stack

  • Opgeslagen als RAM in de computer.
  • Variabelen die op de stapel zijn gemaakt, vallen buiten het bereik en worden automatisch vrijgegeven.
  • Veel sneller te alloceren in vergelijking met variabelen in de heap.
  • Geïmplementeerd met daadwerkelijke stapelgegevensstructuur.
  • Slaat lokale gegevens op, retourneert adressen die worden gebruikt om parameters door te geven.
  • Kan een stapel overlopen wanneer te veel van de stapel wordt gebruikt (meestal van oneindige of te diepe recursie, zeer grote distributies).
  • Gegevens die op de stapel zijn gemaakt, kunnen zonder aanwijzingen worden gebruikt.
  • U zou de stapel gebruiken als u precies wist hoeveel gegevens u moet toewijzen voordat u compileert, en het is niet te groot.
  • Meestal is de maximale grootte al bepaald wanneer uw programma start.

Heap:

  • Opgeslagen in het geheugen van de computer op dezelfde manier als de stapel.
  • In C ++ moeten variabelen in de heap handmatig worden vernietigd en nooit buiten het bereik vallen. Gegevens zijn vrijgegeven met delete , delete[] of free .
  • Het is trager om te alloceren in vergelijking met variabelen in de stapel.
  • Wordt op aanvraag gebruikt om een ​​blok gegevens toe te wijzen voor gebruik door het programma.
  • Kan fragmentatie hebben wanneer er veel toewijzingen en vrijstellingen zijn.
  • In C ++ of C worden de gegevens die op de heap zijn gemaakt, aangeduid met pointers en toegewezen aan respectievelijk new of malloc .
  • Mogelijk is er een fout bij het distribueren als er te veel buffer vereist is.
  • U zou een hoop gebruiken als u niet precies weet hoeveel gegevens u tijdens runtime nodig heeft of als u veel gegevens moet toewijzen.
  • Verantwoordelijk voor geheugenlek.

bijvoorbeeld:

2164
17 сент. Het antwoord wordt gegeven door Brian R. Bondy 17 september. 2008-09-17 07:20 '08 om 07:20 uur 2008-09-17 07:20 uur

Het be>

  • In de stapel elementen worden de elementen bovenop elkaar geplaatst in de volgorde waarin ze daar zijn geplaatst en kun je alleen het bovenste deel verwijderen (zonder het hele ding te kantelen).

    2019

1294
19 марта '09 в 17:38 2009-03-19 17:38 het antwoord wordt gegeven door thomasrutter 19 maart '09 om 17:38 2009-03-19 17:38

(Ik heb dit antwoord verplaatst van een andere vraag die er min of meer door werd misleid.)

Het antwoord op uw vraag is implementatiespecifiek en kan verschillen tussen compilers en processorarchitecturen. Dit is echter een vereenvoudigde uitleg.

  • Zowel de stack als de heap zijn geheugengebieden die worden toegewezen van het basisbesturingssysteem (vaak virtueel geheugen, dat op aanvraag aan fysiek geheugen wordt toegewezen).
  • In een omgeving met meerdere threads heeft elke thread zijn eigen volledig onafhankelijke stack, maar ze zullen de heap splitsen. Parallelle toegang moet op de hoop worden beheerd en is onmogelijk op de stapel.

Een stapel

  • De heap bevat een gelinkte lijst met gebruikte en gratis blokken. Aan nieuwe heap allocaties ( new of malloc ) wordt voldaan door het creëren van een geschikt blok uit een van de vrije blokken. Dit vereist het bijwerken van de lijst met blokken op de heap. Deze metagegevens over blokken in een heap worden ook opgeslagen in een heap, vaak in een klein gebied vlak voor elk blok.
  • Naarmate de hoop groeit, worden nieuwe blokken vaak toegewezen van lagere adressen naar hogere adressen. Dus je kunt een hoop zien als een stapel geheugenblokken die groter worden naarmate het geheugen wordt toegewezen. Als de heap te klein is om te verspreiden, kan de grootte vaak worden verhoogd door meer geheugen van het onderliggende besturingssysteem te krijgen.
  • Het toewijzen en bevrijden van veel kleine blokken kan een stapel achterlaten in een staat waarin er veel kleine vrije blokken zijn afgewisseld tussen gebruikte blokken. Een aanvraag voor toewijzing van een groot blok kan mislukken, omdat geen van de vrije blokken groot genoeg is om aan het distributieverzoek te voldoen, zelfs als de gecombineerde grootte van de vrije blokken groot genoeg kan zijn. Dit wordt heap-fragmentatie genoemd.
  • Wanneer een gebruikt blok naast een vrij blok wordt vrijgegeven, kan een nieuw vrij blok worden gecombineerd met een aangrenzend vrij blok om een ​​groter vrij blok te creëren dat op effectieve wijze heap-fragmentatie vermindert.

2019

681
31 июля '09 в 18:54 2009-07-31 18:54 Antwoord wordt gegeven door Martin Liversage 31 juli '09 om 18:54 2009-07-31 18:54

In de volgende code C #