Junior — Middle
Prilikom prenosa podataka u funkciju: šta je efikasnije u smislu korišćenja memorije — niz ili odrezak?
sobes.tech АИ
Одговор од АИ
U Go, nizovi imaju fiksnu veličinu i u potpunosti se čuvaju u memoriji, dok su sliceovi strukture koje sadrže pokazivač na niz, dužinu i kapacitet.
Sa stanovišta korišćenja memorije:
- Niz: zauzima tačno memoriju za sve elemente, veličina je poznata u vreme kompajliranja.
- Slice: sam po sebi zauzima malo memorije (tri reči: pokazivač, dužina, kapacitet), ali ukazuje na niz koji čuva podatke.
Prilikom prosleđivanja funkciji:
- Ako prosledite niz, on se kopira u celosti, što može biti skupo po memoriji i vremenu za velike nizove.
- Ako prosledite slice, kopira se samo struktura slice-a (pokazivač + dužina + kapacitet), a podaci ostaju u originalnom nizu, tj. kopiranje podataka se ne dešava.
Zbog toga je prosleđivanje slice-a efikasnije u pogledu korišćenja memorije i performansi, posebno za velike skupove podataka.
Primer:
func processArray(arr [1000]int) {
// kopira ceo niz
}
func processSlice(s []int) {
// kopira samo strukturu slice-a
}
func main() {
var a [1000]int
processArray(a) // skupo
processSlice(a[:]) // efikasno
}