Sobes.tech
Junior — Middle

Przy przekazywaniu danych do funkcji: co jest bardziej wydajne pod względem wykorzystania pamięci — tablica czy wycinek?

sobes.tech AI

Odpowiedź od AI

W języku Go tablice mają stały rozmiar i są przechowywane w całości w pamięci, podczas gdy slices to struktury zawierające wskaźnik na tablicę, długość i pojemność.

Z punktu widzenia wykorzystania pamięci:

  • Tablica: zajmuje dokładnie tyle pamięci, ile elementów, rozmiar jest znany na etapie kompilacji.
  • Slice: sam w sobie zajmuje niewiele pamięci (trzy słowa: wskaźnik, długość, pojemność), ale wskazuje na tablicę, która przechowuje dane.

Przy przekazywaniu do funkcji:

  • Jeśli przekażesz tablicę, jest ona kopiowana w całości, co może być kosztowne pod względem pamięci i czasu przy dużych rozmiarach.
  • Jeśli przekażesz slice, kopiowana jest tylko struktura slice (wskaźnik + długość + pojemność), a dane pozostają w oryginalnej tablicy, więc nie dochodzi do kopiowania danych.

Dlatego przekazywanie slice jest bardziej efektywne pod względem wykorzystania pamięci i wydajności, szczególnie dla dużych zbiorów danych.

Przykład:

func processArray(arr [1000]int) {
    // kopiuje cały array
}

func processSlice(s []int) {
    // kopiuje tylko strukturę slice
}

func main() {
    var a [1000]int
    processArray(a)    // kosztowne
    processSlice(a[:]) // efektywne
}