Sobes.tech
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
}