Middle
Po kom algoritmu se povećava veličina seka (slice) u Go?
sobes.tech АИ
Одговор од АИ
Увећање величине секције у Go-у се дешава према следећем алгоритму при коришћењу функције append():
- Одређује се потребна капацитет (capacity) нове секције.
- Ако тренутни капацитет довољан за смештај нових елемената (
cap(s) >= len(s) + len(elements)), елементи се једноставно додају на крај тренутне основе масиве, а нова секција показује на ту област. - Ако тренутни капацитет није довољан, додељује се нова основа масиве са већим капацитетом. Алгоритам за одређивање ове нове капацитете је следећи:
- Ако је потребни капацитет већи од двоструког старог (
requiredCap > 2 * oldCap), нови капацитет је једнак потребном. - Ако је стари капацитет мањи од 1024 (
oldCap < 1024), капацитет се удвостручује (newCap = oldCap * 2). - Ако је стари капацитет већи или једнак 1024 (
oldCap >= 1024), капацитет се повећава за 25% (newCap = oldCap + oldCap/4) до достижења или преласка потребног.
- Ако је потребни капацитет већи од двоструког старог (
- Елементи из старе основе масиве се копирају у нову.
- Нови елементи се додају на крај нове основе масиве.
- Нови капацитет може бити благо већи од израчунате вредности због поравнања меморије.
- Функција
append()враћа нови сегмент који показује на нову основу масиве.
Поред тога, стари сегмент и његова основа могу бити уклоњени од стране сакупљача отпада ако више немају референце на њих.