Sobes.tech
Middle+

Gde se nalazi promenljiva kada je istaknuta u gorutini?

sobes.tech АИ

Одговор од АИ

Promenljiva može biti alocirana i na stogu gorutine i na hrpi. To se određuje mehanizmom escape analysis (analiza bekstva) Go kompajlera.

Osnovni principi escape analysis:

  • Ako kompajler može da dokaže da promenljiva živi samo unutar jednog poziva funkcije ili samo unutar stoga jedne gorutine (tj. ne referencira je spolja), ona se alocira na stogu te gorutine. Ovo je brže, jer se stog automatski upravlja i ne zahteva sakupljanje smeća.
  • Ako kompajler ne može da dokaže da je promenljiva ograničena na stog, ili ako postoje reference na nju spolja (npr. prosleđivanje putem pokazivača u drugu funkciju, zapisivanje u globalnu promenljivu, vraćanje iz funkcije putem pokazivača), ona se alocira na hrpi. Hrpa zahteva sakupljanje smeća, što može usporiti izvršenje.

Primer alokacije na stogu:

// Promenljiva 'x' se alocira na stogu gorutine, jer se koristi samo unutar funkcije.
func exampleStack() int {
	x := 10
	return x
}

Primer alokacije na hrpi:

// Promenljiva 'p' (pokazivač na int) i int na koji pokazuje, mogu biti alocirani na hrpi.
// To se dešava zato što se pokazivač vraća iz funkcije i može se koristiti spolja.
func exampleHeap() *int {
	x := 20 // Vrednost 20 može biti alocirana na hrpi
	return &x // Vraćamo adresu promenljive x
}

Escape analysis se dešava tokom kompilacije. Može se proveriti koristeći zastavicu -gcflags "-m":

// Kompajliranje sa analizom bekstva
go build -gcflags "-m" your_package_name

Izlaz kompajlera će pokazati koje promenljive "escape to heap".

Dakle, lokacija promenljive (stog vs hrpa) nije određena time da li je promenljiva alocirana u gorutini, već time kako Go kompajler analizira njen životni ciklus i opseg.