Sobes.tech
Junior — Middle

Pri odovzdávaní údajov do funkcie: čo je efektívnejšie z hľadiska využitia pamäte — pole alebo rez?

sobes.tech AI

Odpoveď od AI

V jazyku Go majú pole pevne veľkosti a sú úplne uložené v pamäti, zatiaľ čo slices sú štruktúry, ktoré obsahujú ukazovateľ na pole, dĺžku a kapacitu.

Z pohľadu využitia pamäti:

  • Pole: zaberá presne toľko pamäti pre všetky prvky, veľkosť je známa počas kompilácie.
  • Slice: sám o sebe zaberá málo pamäti (tri slová: ukazovateľ, dĺžka, kapacita), ale ukazuje na pole, ktoré ukladá dáta.

Pri odovzdávaní do funkcie:

  • Ak odovzdáte pole, celé sa skopíruje, čo môže byť nákladné na pamäť a čas pri veľkých poliach.
  • Ak odovzdáte slice, skopíruje sa iba štruktúra slice (ukazovateľ + dĺžka + kapacita), a dáta zostávajú v pôvodnom poli, teda nedochádza ku kopírovaniu dát.

Preto je odovzdanie slice efektívnejšie z hľadiska využitia pamäti a výkonu, najmä pre veľké množstvá dát.

Príklad:

func processArray(arr [1000]int) {
    // kopíruje celé pole
}

func processSlice(s []int) {
    // kopíruje iba štruktúru slice
}

func main() {
    var a [1000]int
    processArray(a)    // nákladné
    processSlice(a[:]) // efektívne
}