Uživatelské nástroje

Nástroje pro tento web


it:sw:stack_vs_heap

Stack vs. Heap (Zásobník vs. Halda)

Při běhu programu přiděluje operační systém aplikaci paměť RAM, která je logicky rozdělena do dvou hlavních struktur: Stack a Heap. Správné pochopení jejich fungování pomáhá psát efektivnější kód a předcházet chybám typu „Stack Overflow“.

1. Stack (Zásobník)

Stack je paměťová struktura typu LIFO (Last-In, First-Out – „poslední dovnitř, první ven“). Funguje podobně jako stoh talířů: nový talíř položíte nahoru a jako první odeberete také ten vrchní.

  • Co se sem ukládá: Hodnotové typy (integers, bools), lokální proměnné funkcí a adresy pro návrat z funkcí.
  • Správa: Je automatická a extrémně rychlá. Paměť je alokována při zavolání funkce a uvolněna okamžitě po jejím skončení.
  • Velikost: Je omezená a relativně malá (obvykle jednotky MB). Pokud dojde k příliš hlubokému vnoření funkcí (např. nekonečná rekurze), dojde k chybě Stack Overflow.

2. Heap (Halda)

Heap je velký blok paměti určený pro dynamickou alokaci. Data jsou zde ukládána náhodně tam, kde je zrovna volné místo.

  • Co se sem ukládá: Referenční typy (objekty, pole, instance tříd). Na Stacku zůstává pouze „ukazatel“ (adresa), který míří na data uložená na Heapě.
  • Správa: Je složitější. V jazycích jako C# nebo Java ji spravuje Garbage Collector, v jazycích C/C++ ji musí spravovat programátor ručně.
  • Velikost: Je mnohem větší než Stack, omezená prakticky jen velikostí dostupné RAM.

3. Srovnávací tabulka

Vlastnost Stack (Zásobník) Heap (Halda)
Struktura LIFO (Stoh) Hierarchická / Náhodná
Rychlost Velmi vysoká Pomalejší (hledání místa)
Správa Automatická (procesorem) Garbage Collector nebo ruční
Životnost Jen po dobu běhu funkce Dokud je objekt potřeba
Pád aplikace Stack Overflow Out of Memory / Memory Leak

4. Praktický příklad (C#)

public void MojeMetoda() {
    int vek = 25;              // Hodnotový typ -> uložen na STACKU
    string jmeno = "Petr";    // Referenční typ -> "jmeno" (odkaz) je na STACKU,
                               // ale text "Petr" je uložen na HEAPĚ
} // Po skončení metody "vek" i odkaz "jmeno" okamžitě mizí ze Stacku.
  // Text na Heapě zůstává, dokud ho neuklidí Garbage Collector.

5. Kdy co použít?

* Stack používejte pro krátkodobá, malá data a výpočty uvnitř funkcí. * Heap je nezbytný pro data, která musí přežít konec funkce, nebo pro velké objekty, které by se na Stack nevešly.


Související články:

Tagy: programming memory stack heap performance computer-science

it/sw/stack_vs_heap.txt · Poslední úprava: autor: admin