Stackgeheugen versus heapgeheugen

mogelijk Duplicaat:
Wat en waar zijn de stapel en heap

Ik ben programmeren in C++ en ik vraag me altijd af wat precies is Stack Memory vs Heap Memory. Alles wat ik weet is wanneer ik nieuw noem, ik zou het geheugen van de hoop krijgen. Als u lokale variabelen maakt, zou ik het geheugen van de stapel krijgen. Na wat onderzoek op internet is het meest voorkomende antwoord stapelgeheugen tijdelijk en heapgeheugen is permanent.

is stapel en heap geheugenmodel een concept van besturingssysteem of computerarchitectuur? Dus een deel van het volgt mogelijk geen stapel en heap geheugenmodel of die ze allemaal volgen?

Stapel en heapgeheugen is de abstractie over het geheugenmodel van het virtuele geheugen (dat het geheugen tussen schijf en ram kan wisselen). Dus beide stapel- als heapgeheugen kunnen fysiek ram of de schijf zijn? Wat is dan de reden waar Heap-toewijzing langzamer lijkt te zijn dan de stack-tegenhanger?

Ook zou het hoofdprogramma worden uitgevoerd in de stapel of een hoop?

Wat zou ook gebeuren als een proces uit de stapelgeheugen of heapgeheugen is toegewezen?

bedankt


Antwoord 1, Autoriteit 100%

In C++ is het stapelgeheugen waar lokale variabelen worden opgeslagen / geconstrueerd. De stapel wordt ook gebruikt om parameters die zijn doorgegeven aan functies.

De stapel lijkt erg op de STD :: Stack-klasse: u pusht de parameters erop en bel dan een functie. De functie weet dan dat de parameters die het verwacht te vinden aan het einde van de stapel. Evenzo kan de functie de lokale bevolking op de stapel duwen en deze eraf komen voordat u terugkeert van de functie. (Bewaar – compiler-optimalisaties en bellende conventies Alle betekenen dat het niet zo eenvoudig is)

De stapel wordt echt het best begrepen vanaf een laag niveau en ik zou Kunst van het assembleren – parameters doorgeven aan de stapel. Zelden of nooit zou je enige vorm van handmatige stapelmanipulatie vanuit C++ overwegen.

Over het algemeen heeft de stapel de voorkeur omdat deze zich gewoonlijk in de CPU-cache bevindt, dus bewerkingen met objecten die erop zijn opgeslagen, zijn meestal sneller. De stapel is echter een beperkte hulpbron en mag niet voor iets groots worden gebruikt. Als het stackgeheugen bijna vol is, wordt dit een Stackbufferoverflowgenoemd. Het is een serieus iets om tegen te komen, maar je zou er eigenlijk geen moeten tegenkomen, tenzij je een gekke recursieve functie of iets dergelijks hebt.

Hoop geheugen is veel zoals rskar zegt. Over het algemeen komen C++-objecten die zijn toegewezen met nieuw, of geheugenblokken die zijn toegewezen aan bijvoorbeeld malloc, op de heap terecht. Heapgeheugen moet bijna altijd handmatig worden vrijgemaakt, hoewel u echt een slimme aanwijzerklasse of iets dergelijks moet gebruiken om te voorkomen dat u eraan hoeft te denken. Als het heapgeheugen opraakt, kan (zal?) dit resulteren in een std::bad_alloc.


Antwoord 2, autoriteit 52%

Stapelgeheugen is specifiek het geheugenbereik dat toegankelijk is via het stapelregister van de CPU. De Stack werd gebruikt als een manier om het codepatroon “Jump-Subroutine”-“Return” in assembler te implementeren, en ook als een middel om interruptafhandeling op hardwareniveau te implementeren. Tijdens een onderbreking werd de stapel bijvoorbeeld gebruikt om verschillende CPU-registers op te slaan, waaronder Status (die de resultaten van een bewerking aangeeft) en Programmateller (waar was de CPU in het programma toen de onderbreking plaatsvond).

Stapelgeheugen is grotendeels het gevolg van het gebruikelijke CPU-ontwerp. De snelheid van de toewijzing/deallocatie is snel omdat het strikt een last-in/first-out ontwerp is. Het is een simpele kwestie van een verplaatsingsbewerking en een decrement/verhogingsbewerking op het stapelregister.

Heap-geheugen was gewoon het geheugen dat over was nadat het programma was geladen en het Stack-geheugen was toegewezen. Het kan (of niet) globale variabele ruimte bevatten (het is een kwestie van conventie).

Moderne preventieve multitasking-besturingssystemen met virtueel geheugen en aan geheugen toegewezen apparaten maken de werkelijke situatie ingewikkelder, maar dat is Stack vs Heap in een notendop.


Antwoord 3, autoriteit 6%

Het is een taalabstractie – sommige talen hebben beide, sommige een, sommige geen van beide.

In het geval van C++ wordt de code niet uitgevoerd in de stapel of de heap. Je kunt testen wat er gebeurt als je heap-geheugen opraakt door herhaaldelijk newaan te roepen om geheugen in een lus toe te wijzen zonder deleteaan te roepen om het vrij te maken. Maak echter een systeemback-up voordat u dit doet.

Other episodes