Sobes.tech
Junior — Middle

Ako sa v pamäti ukladajú veľkosti a rezervné objemy rezov v programovacom jazyku?

sobes.tech AI

Odpoveď od AI

V jazyku Go je rez (slice) štruktúra, ktorá obsahuje tri hlavné polia:

  1. Ukazovateľ na pole — adresa prvého prvku rezu v pamäti.
  2. Dĺžka (len) — počet prvkov dostupných na čítanie.
  3. Kapacita (cap) — maximálny počet prvkov, ktoré môže rez obsahovať bez pridelenia novej pamäti.

V pamäti je rez približne reprezentovaný takto:

type SliceHeader struct {
    Data uintptr // ukazovateľ na pole
    Len  int     // dĺžka rezu
    Cap  int     // kapacita rezu
}

Pri vytváraní rezu sa alokuje pole s určenou kapacitou. Ak pri pridávaní prvkov dĺžka presiahne kapacitu, alokuje sa nové väčšie pole a údaje sa skopírujú tam.

Rezervovaná kapacita (capacity) umožňuje efektívne riadenie pamäti, znižuje počet alokácií pri raste rezu.

Príklad:

s := make([]int, 3, 5) // dĺžka=3, kapacita=5
s = append(s, 4)        // dĺžka=4, kapacita=5
s = append(s, 5)        // dĺžka=5, kapacita=5
s = append(s, 6)        // dĺžka=6, kapacita=10 (alokuje sa nová pamäť)

Takto sa veľkosti a rezervované kapacity rezu ukladajú do štruktúry rezu a automaticky sa spravujú počas behu programu.