Call stack

Tags:    c++

Et meget dumt spørgsmål!
Hvad betyder "call stack", er det et blok af kode som bliver ekskveret, eller er det noget med hukommelsen at gøre??



Et meget dumt spørgsmål!
Hvad betyder "call stack", er det et blok af kode som bliver ekskveret, eller er det noget med hukommelsen at gøre??


Det har noget med hukommelsen at gøre.

Stakken er et område i hukommelsen hvor værdier lægges på i toppen og tages fra toppen igen. Dvs. den sidste værdi lagt på stakken er den første som fjernes (tænk på en stak tallerkener).

Denne stak bruges til at indeholde de variabler, som du erklærer i funktioner, til at indeholde parametre til funktioner, til retur adresser og lidt andre småting.

Når du kalder en funktion, forventer du, at programmet fortsætter med linjen efter funktionskaldet, når funktionen er færdig. Det sker ved at når kaldet til funktionen udføres, så lægges adressen på instruktionen efter funktions kaldet lagt på stakken og der springes til funktionens adresse, hvorfra programmet fortsætter. Når funktionen er færdig, springes der så til adressen på stakken og denne værdi fjernes fra stakken. Nu er programmet så tilbage til instruktionen efter funktionen.

En callstack er bare et andet udtryk for stakken, men gerne i forbindelse med de oplysninger der foreligger om hvilke funktioner, programmet lige nu er i gang med at udføre. Du aflæser ofte din callstack gennem en debugger, hvis du f.eks. vil vide, hvorfra en funktion kaldes, så kigger du på din callstack, og ser hvilken funktion, der skal springes tilbage til, når din funktion er færdig.



Indlæg senest redigeret d. 19.08.2008 16:16 af Bruger #2695
Wow! 1000 mange tak for svar! :D
Nu giver det hele lidt mere mening.



Lige et par pedantisk sidebemærkninger til Roberts fine gennemgang.

Det er ikke alle processorer der putter retur adressen på stakken når den kalder en funktion, nogle processorer (f.eks. ARM) putter retur adressen i et specielt register.

Der findes processorer (Siemens C16x f.eks) der har separate stakke til call stack og parameter stack.



Lige et par pedantisk sidebemærkninger til Roberts fine gennemgang.

Det er ikke alle processorer der putter retur adressen på stakken når den kalder en funktion, nogle processorer (f.eks. ARM) putter retur adressen i et specielt register.

Der findes processorer (Siemens C16x f.eks) der har separate stakke til call stack og parameter stack.


Ja, der er mange interessante og direkte "mærkelige" arkitekturer derude :-)

Men er der så en begrænsning på, hvor dybe kald man kan have på ARM ? Jeg mener, laver man et funktions kald fra et funktions kald, så overskriver man vel retur adressen i det register, du snakkede om. Eller ved dyb rekursion. Hvordan håndteres det på ARM ?



På ARM; hvis en funktion kalder videre, og ønsker at den kaldte funktion skal returnere til funktionen (det normale), pusher funktionen registret med retur adressen på stakken sammen med de andre registre funktionen måtte have brug for.
Det har den fordel at man kun pusher hvis det er nødvendigt; simple funktioner der ikke kalder andre funktioner pusher ikke registret.

At returnere fra en funktion er så enten at flytte registret med retur adressen over i program-counteren (et andet register), hvis man ikke har pushet retur adressen, eller poppe fra stakken, inklusive retur adressen.

Hvis en funktion ender med at kalde en anden funktion, evt returnere det denne funktion returnerer, popper man retur adressen inden kaldet, så springer man et hop over når den kaldte funktion returner.



t