Junior — Middle
W jaki sposób w pamięci przechowywane są rozmiary i rezerwowe objętości przekrojów w języku programowania?
sobes.tech AI
Odpowiedź od AI
W języku Go, slice jest strukturą zawierającą trzy główne pola:
- Wskaźnik na tablicę — adres pierwszego elementu slice'a w pamięci.
- Długość (len) — liczba elementów dostępnych do odczytu.
- Pojemność (cap) — maksymalna liczba elementów, które może pomieścić slice bez przydzielania nowej pamięci.
W pamięci, slice jest reprezentowany mniej więcej tak:
type SliceHeader struct {
Data uintptr // wskaźnik na tablicę
Len int // długość slice'a
Cap int // pojemność slice'a
}
Podczas tworzenia slice'a, przydzielana jest tablica o określonej pojemności. Jeśli podczas dodawania elementów długość przekracza pojemność, przydzielana jest nowa tablica większego rozmiaru, a dane są kopiowane do niej.
Rezerwowa pojemność (capacity) pozwala na efektywne zarządzanie pamięcią, zmniejszając liczbę alokacji podczas rozrostu slice'a.
Przykład:
s := make([]int, 3, 5) // len=3, cap=5
s = append(s, 4) // len=4, cap=5
s = append(s, 5) // len=5, cap=5
s = append(s, 6) // len=6, cap=10 (alokacja nowej pamięci)
W ten sposób, rozmiary i rezerwowane pojemności slice'ów są przechowywane w strukturze slice'a i zarządzane automatycznie podczas działania programu.