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:
- Massiivi näitaja — aadress esimesele viiluelemendile mälus.
- Pikkus (len) — kättesaadavate elementide arv lugemiseks.
- 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.