Sobes.tech
Junior — Middle

Kuidas salvestatakse mälus lõikude suurused ja reservemahud programmeerimiskeeles?

sobes.tech AI

Vastus AI-lt

Go keeles, viil (slice) on struktuur, mis sisaldab kolme peamist välja:

  1. Massiivi näitaja — aadress esimesele viiluelemendile mälus.
  2. Pikkus (len) — kättesaadavate elementide arv lugemiseks.
  3. Võimsus (cap) — maksimaalne elementide arv, mida viil võib sisaldada ilma uue mälu eraldamiseta.

Mälus on viil umbes selliselt esitatud:

type SliceHeader struct {
    Data uintptr // näitaja massiivile
    Len  int     // viilu pikkus
    Cap  int     // viilu võimsus
}

Viilu loomisel eraldatakse massiiv kindla võimsusega. Kui elementide lisamisel pikkus ületab võimsuse, eraldatakse suurem massiiv ja andmed kopeeritakse sinna.

Eraldatud võimsus (capacity) võimaldab tõhusalt hallata mälu, vähendades eraldamiste arvu viilu kasvades.

Näide:

s := make([]int, 3, 5) // pikkus=3, võimsus=5
s = append(s, 4)        // pikkus=4, võimsus=5
s = append(s, 5)        // pikkus=5, võimsus=5
s = append(s, 6)        // pikkus=6, võimsus=10 (uus mälu eraldatakse)

Nii salvestatakse viilude suurused ja reserveeritud võimsused viilu struktuuris ning neid hallatakse automaatselt jooksvalt.