Gdzie i jak zwykle realizowana jest segmentacja w pamięci podczas wykonywania programu?
sobes.tech AI
Odpowiedź od AI
W Go, slice to struktura danych zawierająca trzy pola: wskaźnik na tablicę w pamięci, długość (len) i pojemność (cap). Podczas działania programu, slice jest przechowywany na stosie (jeśli jest lokalny), a sama tablica, na którą wskazuje, znajduje się na stercie lub w pamięci statycznej, w zależności od sytuacji.
Gdy tworzysz slice, na przykład s := make([]int, 5, 10), alokowana jest tablica z 10 elementami na stercie, a slice zawiera wskaźnik na początek tej tablicy, długość 5 i pojemność 10. Przy przekazywaniu slice do funkcji, kopiowana jest tylko struktura slice (3 pola), a nie cała tablica, co jest efektywne pod względem pamięci.
Przykład:
s := []int{1, 2, 3}
// s - struktura z wskaźnikiem na tablicę [1,2,3], len=3, cap=3
func appendValue(slice []int, val int) []int {
return append(slice, val)
}
s = appendValue(s, 4)
Tutaj append może zaalokować nową tablicę, jeśli pojemność jest niewystarczająca, i zwrócić nowy slice z wskaźnikiem na tę tablicę.