/ / Sú všetky premenné v Go pridelené na halde? - správa pamäte, ísť, pamäť haldy

Sú všetky premenné v Go pridelené na halde? - správa pamäte, ísť, halda-pamäť

Som nový Go a zistil som, že je v poriadku vrátiť adresu lokálnej premennej definovanej vo funkcii. To samozrejme nie je možné v C, pretože lokálna premenná je v zásobníku.

Tak som len premýšľal, prečo je v poriadku urobiť toÍsť? V Go je lokálna premenná v halde? Ovplyvní to výkonnosť, pretože pridelenie pamäte haldy je dosť drahé ako zásobník? Je možné priradiť lokálnu premennú v zásobníku v Go? Alebo vlastne je v pamäti Go stack?

odpovede:

10 pre odpoveď č. 1

V FAQ sa nachádza veľmi jasná odpoveď na túto otázku:

Ako zistím, či je premenná pridelená na halde alebo stoh?

Z hľadiska správnosti nemusíteviem. Každá premenná v Go existuje, pokiaľ sú na ňu odkazy. Skladovanie implementácia je irelevantná pre sémantiku jazyka.

Skladovacie miesto má vplyv naefektívne písanie programy. Ak je to možné, kompilátory Go pridelia premenné, ktoré sú lokálne pre funkciu v rámčeku zásobníka tejto funkcie kompilátor nedokáže dokázať, že premenná nie je uvedená po funkcia vráti, potom kompilátor musí prideliť premennú haldy zhromaždené na odpadky, aby sa zabránilo visiacim chybám ukazovateľa. Tiež, ak lokálna premenná je veľmi veľká, môže mať väčší zmysel ju uložiť na halde, nie na zásobníku.

V aktuálnych kompilátoroch, ak má premenná svojuadresu, ktorú premenná je kandidát na pridelenie na halde. Základné analýza úniku rozpozná niektoré prípady, keď takéto premenné nebudú žiť okolo návratu z funkcie a môže bývať v zásobníku.

TLDR: Nemali by ste sa starať.