Middle+
Варзиши тағйирёбанда дар гуруҳ чӣ гуна аст?
sobes.tech AI
Ҷавоб аз AI
Вариаблӣ метавонад дар ёдгории goroutine ё дар хонаи ёдгории умумӣ ҷойгир карда шавад. Ин тавассути механизми escape analysis (таҳлили фирор) компилятори Go муайян карда мешавад.
Принсипҳои асосии таҳлили фирор:
- Агар компилятор тавонанд исбот кунанд, ки вариаблӣ танҳо дар дохили як даъвати функсия ё танҳо дар доираи ёдгории goroutine зиндагӣ мекунад (яъне, ба он аз берун ишора намешавад), он дар ёдгории goroutine ҷойгир карда мешавад. Ин тезтар аст, зеро ёдгории автоматӣ идора карда мешавад ва ниёз ба ҷамъоварии партовҳо нест.
- Агар компилятор натавонанд исбот кунанд, ки вариаблӣ маҳдуд ба ёдгории аст, ё агар ба он ишораҳо аз берун вуҷуд дошта бошанд (масалан, тавассути нишондиҳанда ба функсияи дигар гузаронида мешавад, дар тағйирёбии глобалӣ навишта мешавад, аз функсия тавассути нишондиҳанда баргардонида мешавад), он дар ёдгории умумӣ ҷойгир карда мешавад. Ёдгории умумӣ ниёз ба ҷамъоварии партовҳо дорад, ки метавонад иҷрои онро суст кунад.
Масали ҷойгиркунии дар ёдгории умумӣ:
// Вариабл 'x' дар ёдгории goroutine ҷойгир карда мешавад, зеро танҳо дар дохили функсия истифода мешавад.
func exampleStack() int {
x := 10
return x
}
Масали ҷойгиркунии дар ёдгории умумӣ:
// Вариабл 'p' (нишондиҳанда ба int) ва int, ки ба он ишора мекунад, метавонанд дар ёдгории умумӣ ҷойгир карда шаванд.
// Ин рӯй медиҳад, зеро нишондиҳанда аз функсия баргардонида мешавад ва метавонад аз берун истифода шавад.
func exampleHeap() *int {
x := 20 // Арзиши 20 метавонад дар ёдгории умумӣ ҷойгир карда шавад
return &x // Манзили тағйирёбро бармегардонад
}
Таҳлили фирор дар вақти компиляция сурат мегирад. Онро бо истифода аз рамзи -gcflags "-m" санҷидан мумкин аст:
// Компилятсия бо таҳлили фирор
go build -gcflags "-m" your_package_name
Натиҷаи компилятор нишон медиҳад, ки кадом тағйирёбҳо "escape to heap" шудаанд.
Аз ин рӯ, ҷойгиршавии тағйирёб (дар ёдгории умумӣ ё дар ёдгории goroutine) бо он чӣ тағйирёб дар goroutine ҷойгир карда шудааст ё на, муайян намешавад, балки бо чӣ гуна таҳлили ҳаёти он ва доираи истифодаи он аз ҷониби компилятори Go вобаста аст.