Kod:
| |
| odefinierat |
+-------------+ <-- SP
| double *c |
| double b |
| ... |
| double a |
| ... |
+-------------+
| startup- |
| kodens |
| variabler |
+-------------+
| nåt annat |
| programs |
| variabler |
+-------------+
| osv... |
---+-------------+---
BOTTEN AV STACKEN
Såhär skulle stacken kunna se ut när triangle() ska anropas. main() kommer åt sina variabler relativt via stackpekaren, t.ex. *SP för c och *(SP + 4) för b. Vid anropet ökas/minskas SP uppåt (det finns stackar som börjar på en låg adress och ökar, och de som börjar på en hög adress och minskar) för att ge plats för triangle()s parametrar och lokala variabler. Argumenten kopieras, resten av variablerna lämnas odefinierade och kontrollen överförs till triangle(). När triangle returnerar, minskas/ökas SP tillbaka igen och kontrollen överförs till main() som fortsätter att komma åt sina variabler via SP som om inget hade hänt.
Så ett funktionsanrop och en returnering går enormt fort. Det är egentligen bara kopieringen av argumenten som tar tid, och eventuell initialisering av variabler. Själva "allokeringen" av minnet får man nästan gratis (bara ändra SP).
Sen tillkommer returadresser, returvärden och att processorer har ett gäng register som är mycket snabbare att arbeta med än mot RAM. En kompilator kan t.ex. välja att istället spara undan ett par register på stacken, låta den anropade funktionen använda dem fritt, och återställa dem från stacken efteråt.