Junior — Middle
Hogyan tárolódnak a memóriában a szeletek méretei és tartalék térfogatai a programozási nyelvben?
sobes.tech MI
Válasz az MI-től
A Go nyelvben a szelet (slice) egy olyan szerkezet, amely három fő mezőt tartalmaz:
- Tömbre mutató pointer — a szelet első elemének címe a memóriában.
- Hossz (len) — az olvasható elemek száma.
- Kapacitás (cap) — a maximális elem szám, amit a szelet anélkül foglalhat le, hogy új memóriát foglalna.
A memóriában a szelet nagyjából így van ábrázolva:
type SliceHeader struct {
Data uintptr // pointer a tömbre
Len int // a szelet hossza
Cap int // a szelet kapacitása
}
Szelet létrehozásakor egy adott kapacitású tömb kerül lefoglalásra. Ha az elemek hozzáadásakor a hossz meghaladja a kapacitást, akkor egy nagyobb méretű új tömb kerül lefoglalásra, és az adatok oda másolódnak.
A lefoglalt kapacitás (capacity) hatékony memóriakezelést tesz lehetővé, csökkentve az allokációk számát a szelet növekedése során.
Példa:
s := make([]int, 3, 5) // hossz=3, kapacitás=5
s = append(s, 4) // hossz=4, kapacitás=5
s = append(s, 5) // hossz=5, kapacitás=5
s = append(s, 6) // hossz=6, kapacitás=10 (új memória foglalás)
Így a szeletek méretei és lefoglalt kapacitásai a szelet struktúrában tárolódnak, és automatikusan kezelődnek futás közben.