stack frame
Főnév
stack frame (tsz. stack frames)
- (informatika) A Stack Frame (veremkeret) egy speciális memória-terület a Call Stack-ben, amely minden egyes függvényhíváskor létrejön és tartalmazza az adott függvényhez tartozó információkat. A stack frame-ek egymásra épülnek a LIFO (Last In, First Out – utoljára be, elsőként ki) elv szerint, és a függvény visszatérésekor automatikusan törlődnek.
1. Mi az a Stack Frame?
Egy Stack Frame minden egyes függvényhíváskor létrejön, és tartalmazza: - A függvény paramétereit (ha vannak). - A lokális változókat. - A visszatérési címet (hogy a függvény visszatérése után a program tudja, hová térjen vissza).
Stack Frame szerkezete:
| Stack Frame (függvény 3) | | Stack Frame (függvény 2) | | Stack Frame (függvény 1) | | Stack Frame (main) | ----------------------------
Minden új függvényhíváskor egy új stack frame kerül a verem tetejére, és amikor a függvény visszatér, az adott stack frame törlődik.
2. Stack Frame működése egy példán keresztül
Példa kód:
#include <iostream>
using namespace std;
void fuggvenyB(int b) {
int x = b * 2; // Lokális változó
cout << "fuggvenyB, x = " << x << endl;
}
void fuggvenyA(int a) {
int y = a + 5; // Lokális változó
cout << "fuggvenyA, y = " << y << endl;
fuggvenyB(y); // Meghívja fuggvenyB()-t
}
int main() {
int z = 10; // Lokális változó
cout << "main, z = " << z << endl;
fuggvenyA(z); // Meghívja fuggvenyA()-t
return 0;
}
3. Stack Frame állapota lépésenként
Ha ezt a programot lefuttatjuk, az alábbi stack frame-ek jönnek létre:
1️⃣ Amikor a main() elindul:
| Stack Frame (main) | <-- `z` változó (értéke: 10) ----------------------------
2️⃣ Amikor fuggvenyA(z) meghívódik:
| Stack Frame (fuggvenyA) | <-- `a = 10`, `y = 15` | Stack Frame (main) | ----------------------------
3️⃣ Amikor fuggvenyB(y) meghívódik:
| Stack Frame (fuggvenyB) | <-- `b = 15`, `x = 30` | Stack Frame (fuggvenyA) | | Stack Frame (main) | ----------------------------
4️⃣ Amikor fuggvenyB befejeződik, stack frame törlődik:
| Stack Frame (fuggvenyA) | | Stack Frame (main) | ----------------------------
5️⃣ Amikor fuggvenyA befejeződik, stack frame törlődik:
| Stack Frame (main) | ----------------------------
6️⃣ Amikor main() befejeződik, a teljes stack kiürül.
Kimenet:
main, z = 10 fuggvenyA, y = 15 fuggvenyB, x = 30
4. Stack Frame és Rekurzió
A rekurzió során minden egyes rekurzív hívás új stack frame-et hoz létre, amely addig marad a stackben, amíg a függvény nem tér vissza.
Rekurzív példa:
void rekurzivFuggveny(int n) {
if (n == 0) return; // Kilépési feltétel
cout << "n = " << n << endl;
rekurzivFuggveny(n - 1); // Rekurzív hívás
}
int main() {
rekurzivFuggveny(5);
return 0;
}
Stack Frame állapot rekurziónál (rekurzivFuggveny(5))
rekurzivFuggveny(5)rekurzivFuggveny(4)rekurzivFuggveny(3)rekurzivFuggveny(2)rekurzivFuggveny(1)rekurzivFuggveny(0)– innentől visszafele törlődnek a stack frame-ek.
🔴 Probléma: Ha túl mély a rekurzió (n túl nagy), stack overflow léphet fel!
✅ Megoldás: Mindig adjunk meg kilépési feltételt a rekurzióhoz, vagy használjunk iteratív megoldást.
5. Stack Frame és Stack Overflow
Ha egy program túl sok stack frame-et hoz létre, stack overflow következhet be.
Hibás kód (végtelen rekurzió – stack overflow):
void vegtelenRekurzio() {
vegtelenRekurzio(); // Végtelen hívás
}
int main() {
vegtelenRekurzio(); // Stack overflow
return 0;
}
🔴 Hiba: Mivel nincs kilépési feltétel, a stack folyamatosan növekszik, amíg a memória el nem fogy.
✅ Megoldás: - Használj iterációt rekurzió helyett. - Használj heap memóriát nagy adatstruktúrákhoz. - Növeld a stack méretét operációs rendszer szinten (ha szükséges).
6. Összegzés
✅ A Stack Frame minden egyes függvényhíváskor létrejön és tartalmazza: - A függvény paramétereit. - A lokális változókat. - A visszatérési címet.
✅ A függvény visszatérésekor a stack frame automatikusan törlődik.
✅ A rekurzió esetén minden hívás új stack frame-et hoz létre.
🔴 Stack overflow léphet fel, ha túl sok stack frame jön létre, például végtelen rekurzió miatt.
- stack frame - Szótár.net (en-hu)
- stack frame - Sztaki (en-hu)
- stack frame - Merriam–Webster
- stack frame - Cambridge
- stack frame - WordNet
- stack frame - Яндекс (en-ru)
- stack frame - Google (en-hu)
- stack frame - Wikidata
- stack frame - Wikipédia (angol)