call stack
Főnév
call stack (tsz. call stacks)
- (informatika) A call stack (hívási verem) egy olyan memória-terület, amelyet a program függvényhívások kezelésére használ. Ez egy LIFO (Last In, First Out – utoljára be, elsőként ki) struktúra, amely minden függvényhívásnál egy új stack frame-et hoz létre. A függvények visszatérésekor a megfelelő stack frame törlődik.
1. Hogyan működik a Call Stack C++ nyelven?
A Call Stack az alábbi módon működik:
- Amikor egy függvény meghívódik:
- Új stack frame jön létre a hívási veremben.
- Ebben a frame-ben tárolódnak:
- A függvény paraméterei.
- A függvény lokális változói.
- A visszatérési cím, hogy a függvény vége után a program tudja, hova térjen vissza.
- Amikor a függvény befejeződik:
- A megfelelő stack frame törlődik a veremből.
- A vezérlés visszatér az előző függvénybe (a meghívó helyre).
Egyszerű példa Call Stack működésére:
#include <iostream>
using namespace std;
void fuggvenyB() {
cout << "Függvény B meghívva" << endl;
}
void fuggvenyA() {
cout << "Függvény A meghívva" << endl;
fuggvenyB(); // Meghívja fuggvenyB()-t
}
int main() {
cout << "main() függvény kezdődik" << endl;
fuggvenyA(); // Meghívja fuggvenyA()-t
cout << "main() függvény véget ért" << endl;
return 0;
}
Call Stack állapota lépésenként:
main()meghívásamainstack frame létrejön.
fuggvenyA()meghívásafuggvenyAstack frame kerül amainfölé.
fuggvenyB()meghívásafuggvenyBstack frame kerül afuggvenyAfölé.
fuggvenyB()befejeződikfuggvenyBstack frame törlődik.
fuggvenyA()befejeződikfuggvenyAstack frame törlődik.
main()befejeződikmainstack frame törlődik, és a program véget ér.
Kimenet:
main() függvény kezdődik Függvény A meghívva Függvény B meghívva main() függvény véget ért
2. Rekurzió és a Call Stack
Mivel minden függvényhívás egy új stack frame-et hoz létre, a rekurzió nagy mélység esetén stack overflow-t okozhat.
Példa: helyes rekurzió (kilépési feltétellel)
void szamolas(int n) {
if (n == 0) return; // Kilépési feltétel
cout << "n: " << n << endl;
szamolas(n - 1);
}
int main() {
szamolas(5);
return 0;
}
Call Stack állapota 5 → 4 → 3 → 2 → 1 → 0 - szamolas(5) → szamolas(4) → szamolas(3) → szamolas(2) → szamolas(1) → szamolas(0) - Ekkor a stack visszafelé törlődik.
✅ Nincs stack overflow, mert van kilépési feltétel (n == 0).
3. Stack Overflow Call Stack esetén
A végtelen vagy túl mély rekurzió stack overflow-hoz vezet, mert minden rekurzív hívás új stack frame-et hoz létre, és végül elfogy a memória.
Hibás kód (végtelen rekurzió):
void vegtelenRekurzio() {
vegtelenRekurzio(); // Végtelen hívás
}
int main() {
vegtelenRekurzio(); // Stack overflow
return 0;
}
🔴 Hiba: A vegtelenRekurzio() folyamatosan hívja önmagát, míg a Call Stack teljesen megtelik, és a program összeomlik.
4. Stack méretének növelése
Ha egy program mély rekurziót használ, növelhetjük a stack méretét:
Windows (Visual Studio)
Project Settings → Linker → System → Stack Reserve Size
Vagy parancssorból:
link /STACK:20000000 program.exe
(Ez 20 MB-ra növeli a stack méretét.)
Linux (g++ fordítóval)
ulimit -s 100000
(Ez 100 MB-ra állítja a stack méretét.)
5. Call Stack vs Heap memória
| Tulajdonság | Call Stack (Hívási verem) | Heap memória |
|---|---|---|
| Sebesség | Nagyon gyors | Lassabb |
| Foglalás módja | Automatikus (függvényhívásokkor) | Manuális (new és delete) |
| Méret | Korlátozott | Nagyobb |
| Visszanyerés | Automatikus | delete szükséges |
| Használat | Lokális változók, függvényhívások | Nagy adatok, dinamikus objektumok |
Mikor használjunk heap memóriát?
- Ha nagy méretű tömböket kell tárolni.
- Ha az adatoknak túl kell élniük egy függvényhívást.
- Ha a program sok memóriahasználatot igényel, és a stack túl kicsi.
6. Összegzés
🔹 A Call Stack minden függvényhívásnál új stack frame-et hoz létre.
🔹 A stack gyors, de korlátozott méretű.
🔹 Túl sok rekurzió vagy nagy lokális változók stack overflow-hoz vezethetnek.
🔹 Megoldások stack overflow elkerülésére: - Használj kilépési feltételt rekurzió esetén! - Használj iterációt rekurzió helyett! - Nagy adatokat tárolj a heap memóriában!
- call stack - Szótár.net (en-hu)
- call stack - Sztaki (en-hu)
- call stack - Merriam–Webster
- call stack - Cambridge
- call stack - WordNet
- call stack - Яндекс (en-ru)
- call stack - Google (en-hu)
- call stack - Wikidata
- call stack - Wikipédia (angol)