Sobes.tech
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:

  1. Wskaźnik na tablicę — adres pierwszego elementu slice'a w pamięci.
  2. Długość (len) — liczba elementów dostępnych do odczytu.
  3. 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.