Sobes.tech
Middle+

Kur atrodas mainīgais, kad tas izcelts gorutīnā?

sobes.tech AI

Atbilde no AI

Mainīgais var tikt izdalīts gan steka, gan atkritnē. Tas tiek noteikts ar Go kompilatora escape analysis (izlīšanas analīzes) mehānisma palīdzību.

Galvenie izlīšanas analīzes principi:

  • Ja kompilators var pierādīt, ka mainīgais dzīvo tikai vienas funkcijas izsaukuma laikā vai tikai vienas gorutinas steka robežās (tas ir, tam nav atsauces no ārpuses), tas tiek izdalīts šīs gorutinas stekā. Tas ir ātrāk, jo steks tiek pārvaldīts automātiski un neprasa atkritnēšanas procesu.
  • Ja kompilators nevar pierādīt, ka mainīgais ir ierobežots ar steku, vai ja tam ir atsauces no ārpuses (piemēram, tiek nodots ar norādi citai funkcijai, ierakstīts globālā mainīgajā, atgriezts no funkcijas ar norādi), tas tiek izdalīts atkritnē. Atkritnēšana prasa atkritnēšanas procesu, kas var palēnināt izpildi.

Piemērs, kā tiek izdalīts stekā:

// Mainīgais 'x' tiek izdalīts gorutinas stekā, jo tas tiek izmantots tikai funkcijas iekšienē.
func exampleStack() int {
	x := 10
	return x
}

Piemērs, kā tiek izdalīts atkritnē:

// Mainīgais 'p' (norāde uz int) un uz ko tas norāda, var tikt izdalīts atkritnē.
// Tas notiek tāpēc, ka norāde tiek atgriezta no funkcijas un to var izmantot ārpus tās.
func exampleHeap() *int {
	x := 20 // Vērtība 20 var tikt izdalīta atkritnē
	return &x // Atgriež mainīgā x adresi
}

Izlīšanas analīze notiek kompilācijas laikā. To var pārbaudīt, izmantojot -gcflags "-m" karogu:

go build -gcflags "-m" your_package_name

Kompilatora izvade parādīs, kuri mainīgie "escape to heap".

Tādējādi mainīgā atrašanās vieta (steks vs atkritne) nav noteikta pēc tā, vai mainīgais tiek izdalīts gorutīnā, bet pēc tā, kā Go kompilators analizē tā dzīves ciklu un redzesloku.