static memory allocation (tsz. static memory allocations)
Statikus memóriafoglalás | Dinamikus memóriafoglalás |
---|---|
Compile time | Runtime |
Előre ismert méret | Futás közben határozott |
Általában stack vagy data segment | Heap-en foglalódik |
Nem igényel malloc/free
|
malloc/free , new/delete
|
1️⃣ Globális változók
2️⃣ Static kulcsszóval megjelölt változók
3️⃣ Függvény lokális nem-dinamikus változói (stack)
4️⃣ Constexpr / compile-time állandók
Globális változók program indításakor létrejönnek, és program végéig léteznek.
int counter = 0; // statikus memória a data segmentben
A counter
az adat-szegmensben van, nem a stack-en vagy heap-en.
A static kulcsszó lehetővé teszi, hogy:
void myFunction() {
static int callCount = 0;
callCount++;
std::cout << "Called " << callCount << " times.\n";
}
callCount
nem jön létre újra minden híváskor → egyszer jön létre, program végéig megmarad.
Bár a stack memória futási időben foglalódik, a lokális nem-dinamikus változók fix méretűek → a fordító előre tudja a méretüket → ez is “statikus” memória értelmezés szerint (nem dinamikusan foglalt).
void foo() {
int x = 5; // automatikus, de statikus méret
}
x
a stack-en jön létre, de a mérete compile time ismert → nem dinamikus memória.
Ezek is tipikus példák:
constexpr int MaxValue = 1000;
const double Pi = 3.14159;
👉 Statikus memóriafoglalás: amikor egy programban a memóriafoglalás:
👉 Jellemző példák:
👉 Szemben a dinamikus memóriafoglalással, ahol:
free()
vagy delete
).
✅ Gyors hozzáférés → nincs futási időbeli allokációs költség.
✅ Egyszerű → nincs szükség malloc/free
kezelésére.
✅ Determinista → mindig ugyanakkora memóriahasználat.
❌ Rugalmatlan → nem lehet futás közben változtatni a méretet.
❌ Túlméretezés veszélye → ha túl nagy statikus változókat használsz, az befolyásolhatja a program teljes memóriafogyasztását.
❌ Thread safety → globális / static változókkal óvatosan kell bánni többszálúság (multithreading) esetén, mert minden szál közösen használja őket.
static int count = 0; // data segment → statikus memória
int* arr = (int*) malloc(100 * sizeof(int)); // heap → dinamikus memória
free(arr);
✅ Konstansok → pl. buffer méretek, max értékek.
✅ Globális állapotok (óvatosan!).
✅ Függvényhívás-számlálók → static lokális változóval.
✅ Stack-es lokális változók → kis, gyors ideiglenes adattárolás.