Archief - [ALG] System stack and heap

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

MacK

Legacy Member
Hallo,

ik lees momenteel een boek over C# programmeren, en daar gebruikt de auteur oa de termen 'system stack' and 'heap' . Nu haalde hij aan dat de uitleg daarvan niet tot het thema van het boek behoort, maar dat het wel de moeite waard is om het volledig te begrijpen..

Dus vroeg ik me af of iemand een deftige uitleg zou kunnen geven?

Greetz.

.Acku.

Legacy Member
http://en.wikipedia.org/wiki/Stack_(data_structure)
In computer science, a stack is a data structure that works on the principle of Last In First Out (LIFO). This means that the last item put on the stack is the first item that can be taken off, like a physical stack of plates.
The two main operations applicable to a stack are:

push: an item is put on top of the stack, increasing the stack size by one. As stack size is usually limited, this may provoke a stack overflow if the maximum size is exceeded.
pop: the top item is taken from the stack, decreasing stack size by one. In the case where there was no top item (i.e. the stack was empty), a stack underflow occurs.


http://en.wikipedia.org/wiki/Heap_(programming)
In computer science, dynamic memory allocation is the allocation of memory storage for use in a computer program during the runtime of that program. It is a way of distributing ownership of limited memory resources among many pieces of data and code. A dynamically allocated object remains allocated until it is deallocated explicitly, either by the programmer or by a garbage collector; this is notably different from automatic and static memory allocation. It is said that such an object has dynamic lifetime.

--

In het kort: stacks zijn snel, heaps zijn traag. Zaken waarvan men op voorhand weet hoelang ze gaan leven, en die men kan ordenen, komen op een snelle Stack. Alle andere op de Heap.
Een stack is zoals een stapel papieren, je legt er iets op of je neemt er iets af. Heel snel, maar enkel goed als je enkel het bovenste nodig hebt. Een heap is zoals een zak, je kan er eender wat ingooien of uitnemen, maar het duurt een tijdje voor je het hebt want er is geen orde.

Tyfius

Legacy Member
Op zich mooi om te weten, maar bij talen als Java en C# weinig om tijdens het programmeren mee rekening te houden. (tenzij je low-level dingen gaat maken).

killgore

Legacy Member
Tyfius zei:
Op zich mooi om te weten, maar bij talen als Java en C# weinig om tijdens het programmeren mee rekening te houden. (tenzij je low-level dingen gaat maken).
bwa, 't is toch vrij belangerijk te weten hoe uw geheugen management werkt als ge nie ineens op rare wijze variabelen-waarden wilt zien verdwijnen :).
Ook ist wel handig da ge weet da ge geen arrays van 1000000 64 bit integers kunt aanmaken :p.
Ge moet natuurlijk geen uitgebreide kennis hebben, ma basis is toch vrijwel nodig :).

Vich

Legacy Member
killgore zei:
bwa, 't is toch vrij belangerijk te weten hoe uw geheugen management werkt als ge nie ineens op rare wijze variabelen-waarden wilt zien verdwijnen :).

Bij Visual C++ .NET 2003 krijgt ge dat extragratis, at random :x

wlibaers

Legacy Member
En kan ook handig zijn voor diegenen die door een slechte keuze van datastructuur de complexiteit van hun algoritme een extra orde geven...

Asshen

Legacy Member
Tyfius zei:
Op zich mooi om te weten, maar bij talen als Java en C# weinig om tijdens het programmeren mee rekening te houden. (tenzij je low-level dingen gaat maken).

Are you kidding ?
Dat is nou net één van de belangrijkste dingen om te weten bij de nieuwere OO talen !!!

maxdevis

Legacy Member
Tyfius zei:
Op zich mooi om te weten, maar bij talen als Java en C# weinig om tijdens het programmeren mee rekening te houden. (tenzij je low-level dingen gaat maken).


hmmm,
duidelijk iemand die weet wat C# is, maar niet echt weet hoe het moet gebruiken.
laat dit geen aanval op je zijn,
maar stack en heap zijn wel degelijk heel belangrijk in C#

forloRn_

Legacy Member
Maar in Java dan weer niet: primitives komen op de stack, objecten op de heap. Bovendien moet je door de garbage collection ook geen rekening houden met de lifetime van objecten.

Krueger

Legacy Member
Asshen zei:
Are you kidding ?
Dat is nou net één van de belangrijkste dingen om te weten bij de nieuwere OO talen !!!
Kan je eens een voorbeeld geven waarom het zo belangrijk is daar rekening mee te houden. Ik heb de indruk dat andere dingen veel meer de performance van uw applicatie bepalen, zoals keuze van algoritme.

Asshen

Legacy Member
Om te beginnen worden value types standaard by value en reference types standaard by reference doorgegeven als parameter aan methodes.
Als je dit al niet zou weten, dan moet je zelfs niet beginnen.

Krueger

Legacy Member
Asshen zei:
Om te beginnen worden value types standaard by value en reference types standaard by reference doorgegeven als parameter aan methodes.
Als je dit al niet zou weten, dan moet je zelfs niet beginnen.
Akkoord, maar moet je daarom persee weten wat nu juist de stack en de heap is, en hoe alles wordt bijgehouden in de overeenkomstige structuren? Als je gewoon weet hoe alles wordt doorgegeven, geraak je er ook wel zou ik zo zeggen.

Tyfius

Legacy Member
maxdevis zei:
hmmm,
duidelijk iemand die weet wat C# is, maar niet echt weet hoe het moet gebruiken.
laat dit geen aanval op je zijn,
maar stack en heap zijn wel degelijk heel belangrijk in C#

Mja, misschien wat slecht uitgedrukt van mij. Stack en heap worden nog steeds gebruikt, maar ik wou gewoon even verduidelijken dat door het steeds beter worden van de garbage collector de programmeur steeds minder en minder aandacht dient te besteden aan deze dingen ten opzichte van C++ dan.

Tyfius

Legacy Member
forloRn_ zei:
Maar in Java dan weer niet: primitives komen op de stack, objecten op de heap. Bovendien moet je door de garbage collection ook geen rekening houden met de lifetime van objecten.

Inderdaad, bvb, bij het starten van een functie wordt een stack frame aangemaakt. Lokale variabele binnen die functie komen op de stack binnen die stack frame (int, float, ...) en objecten komen op de heap. Wanneer de functie stopt, worden de variabelen binnen dit stack frame voor verwijdering gemarkeerd, en zal de GC dit stack frame verwijderen wanneer hij zeker is dat hier geen gebruik meer van wordt gemaakt.
Wanneer de laatste referentie gelegd werd naar een object op de heap zal ook dit object het label "to delete" krijgen en zal de GC ook hier optreden.

In C++ worden met de destructor ook alleen heap objecten verwijderd, terwijl de stack objecten automatisch worden verwijderd.

.Acku.

Legacy Member
Asshen zei:
Om te beginnen worden value types standaard by value en reference types standaard by reference doorgegeven als parameter aan methodes.
Als je dit al niet zou weten, dan moet je zelfs niet beginnen.

Relevantie?

forloRn_

Legacy Member
Jezus man, ik zie ook niet direct het verband tussen stack/heap en pass by value/pass by reference hoor. In C++ kan je toch ook variabelen op de stack by reference doorgeven?
In Java leer je dat primitieven blijven bestaan tot hun scope eindigt, en objecten tot er geen referentie meer naar bestaat en de garbage collector zin heeft om ze te verwijderen. Aan termen als stack en heap heeft de gemiddelde Java-programmeur geen boodschap hoor.

.Acku.

Legacy Member
Asshen zei:
Jezus man, hoe (not) snugger kunde zijn.

ga er dan vanuit dat ik niet snugger ben, en antwoord vriendelijk op de vraag, zoals elk hulpvol lid zou doen.
Je zegt uiteindelijk meer dan dat primitives enkel in hun methode/functie leven (op hun 'frame'), en dat objecten doorheen het hele programma doorbewegen waardoor ze moeten GC'ed worden. Erg cool, maar relevant? Geen idee.

Krueger

Legacy Member
Dat was dus mijn punt. Het is zeer "stoer" om te zeggen dat je zeker moet weten wat de stack en de heap zijn, en hoe je er rekening mee moet houden als je programmeert, want blijkbaar anders:
Asshen zei:
Dat is nou net één van de belangrijkste dingen om te weten bij de nieuwere OO talen !!!
Dus ik wacht nog steeds op mijn voorbeeld waarom je persee in de nieuwe OO talen alles perfect moet weten ivm de stack en de heap. Want persoonlijk heb ik de indruk dat er wel andere dingen zijn die belangrijker zijn.

Ik programmeer nu toch ook al een aantal jaren, in veel verschillende talen, en nog nooit heb ik mij zitten afvragen "tiens, zou dat nu op de stack of op de heap worden opgeslagen. Op de Heap natuurlijk, dus zou ik beter mijn code anders structureren..."
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan