Junior
Jak se ve paměti používají zásobník a halda?
sobes.tech AI
Odpověď od AI
Zásobník (stack) se používá pro ukládání místních proměnných, parametrů funkcí a adres návratu. Paměť je automaticky přidělována a uvolňována podle principu LIFO (Last-In, First-Out).
Heap (halda) se používá pro dynamické přidělování paměti pro objekty, jejichž velikost je během kompilace neznámá nebo jejichž životnost přesahuje rozsah, ve kterém jsou vytvořeny. Správa paměti na haldě je prováděna ručně nebo pomocí mechanismů správy paměti (ARC ve Swiftu, garbage collector v jiných jazycích).
| Vlastnost | Zásobník (stack) | Halda (heap) |
|---|---|---|
| Přiřazení | Automatické | Dynamické (ručně nebo s MRC/ARC) |
| Uvolnění | Automaticky při opuštění rozsahu | Ručně (free) nebo s MRC/ARC |
| Velikost dat | Známá při kompilaci | Může být neznámá do doby běhu |
| Přístup | Rychlý, sekvenční | Pomalejší, náhodný |
| Struktura | LIFO | Graf objektů |
| Příklady | Lokální proměnné, parametry funkcí | Objektové třídy, struktury s proměnnou velikostí |
// Příklad použití zásobníku a haldy ve Swiftu
func myFunction() {
// Lokální proměnná na zásobníku
var stackVariable: Int = 10
// Objekt třídy na haldě
let heapObject = MyClass()
// Typ hodnoty na zásobníku (kromě struktur obsahujících referenční typy)
var stackStruct = MyStruct()
// Struktura obsahující referenční typ, část může být na haldě
var mixedStruct = MyMixedStruct()
}
class MyClass {
// Vlastnosti objektu jsou uloženy na haldě
var property: String = "Hello"
}
struct MyStruct {
// Vlastnosti typu hodnoty jsou uloženy na zásobníku
var property: Int = 20
}
class MyReferenceType {
var value: Int = 30
}
struct MyMixedStruct {
// Typ hodnoty na zásobníku
var stackProperty: Int = 40
// Referenční typ na haldě (samotná reference na zásobníku)
var heapReference: MyReferenceType = MyReferenceType()
}