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:
- Ukazovateľ na pole — adresa prvého prvku rezu v pamäti.
- Dĺžka (len) — počet prvkov dostupných na čítanie.
- 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.