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

  1. Tömbre mutató pointer — a szelet első elemének címe a memóriában.
  2. Hossz (len) — az olvasható elemek száma.
  3. 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.