Sobes.tech
Junior — Middle

Adatok átadásakor egy függvénynek: melyik hatékonyabb memóriahasználat szempontjából — egy tömb vagy egy szelet?

sobes.tech MI

Válasz az MI-től

A Go-ban a tömbök fix méretűek és teljes egészében a memóriában tárolódnak, míg a szeletek (slices) egy olyan struktúrák, amelyek mutatót tartalmaznak egy tömbre, valamint hosszúságot és kapacitást.

Memóriahasználat szempontjából:

  • Tömb: pontosan annyi memóriát foglal el, amennyi az összes elem számára szükséges, a méret fordítási időben ismert.
  • Slice: önmagában kevés memóriát foglal (három szó: mutató, hossz, kapacitás), de egy olyan tömbre mutat, amely tárolja az adatokat.

Függvénybe adáskor:

  • Ha tömböt adunk át, az egész másolódik, ami nagy méretű tömbök esetén memória- és időigényes lehet.
  • Ha szelet adunk át, csak a szelet struktúrája (mutató + hossz + kapacitás) másolódik, az adatok az eredeti tömbben maradnak, így adatmásolás nem történik.

Ezért a szelet átadása hatékonyabb memória- és teljesítmény szempontjából, különösen nagy adathalmazok esetén.

Példa:

func processArray(arr [1000]int) {
    // az egész tömb másolása
}

func processSlice(s []int) {
    // csak a szelet struktúrájának másolása
}

func main() {
    var a [1000]int
    processArray(a)    // költséges
    processSlice(a[:]) // hatékony
}