Sobes.tech
Junior — Middle

Za akých podmienok dochádza k automatickému prideľovaniu pamäte z dynamickej oblasti počas kompilácie alebo behu programu?

sobes.tech AI

Odpoveď od AI

V jazyku Go dochádza k automatickej alokácii pamäte z dynamickej oblasti (heap) počas behu programu, keď kompilátor alebo runtime určí, že premenná by mala žiť dlhšie ako aktuálna funkcia alebo gorutina.

Podmienky, za ktorých dochádza k alokácii na heap:

  • Ak je premenná zachytená v uzávierke (closure) a môže byť použitá po opustení funkcie.
  • Ak je premenná vrátená z funkcie alebo odovzdaná inej gorutine.
  • Ak kompilátor nemôže zaručiť, že premenná bude zničená po opustení aktuálneho rozsahu.

Kompilátor Go vykonáva analýzu úniku (escape analysis), aby určil, ktoré premenné majú byť umiestnené na heap a ktoré na zásobník.

Príklad:

func f() *int {
    x := 10
    return &x // x "uniká" na heap, pretože sa vracia ukazovateľ
}

Tu je x alokované na heap, pretože sa vracia ukazovateľ na ňu a môže byť použitý mimo jej rozsahu.