← Назад ко всем вопросам

Насколько увеличивается слайс при превышении capacity

1️⃣ Как кратко ответить

При превышении capacity слайса в Go его емкость увеличивается в зависимости от текущего размера. Если текущая емкость меньше 1024 элементов, она удваивается. Если больше, то увеличивается на 25%.

2️⃣ Подробное объяснение темы

В языке программирования Go слайсы представляют собой динамические массивы, которые могут изменять свой размер. Каждый слайс имеет два основных параметра: длину (length) и емкость (capacity). Длина — это количество элементов, которые слайс в данный момент содержит, а емкость — это количество элементов, которые он может содержать без необходимости выделения новой памяти.

Когда вы добавляете элементы в слайс и его длина превышает текущую емкость, Go автоматически выделяет новый массив большего размера и копирует в него элементы из старого массива. Это позволяет слайсу расти динамически.

Как происходит увеличение емкости

  1. Удвоение емкости: Если текущая емкость слайса меньше 1024 элементов, то при превышении емкости она удваивается. Это позволяет эффективно управлять памятью и минимизировать количество операций по выделению памяти.

  2. Увеличение на 25%: Если текущая емкость слайса больше или равна 1024, то при превышении емкости она увеличивается на 25%. Это сделано для того, чтобы избежать слишком большого потребления памяти при работе с большими слайсами.

Пример кода

Рассмотрим пример, чтобы понять, как это работает на практике:

package main
​
import "fmt"
​
func main() {
    // Создаем слайс с начальной емкостью 2
    s := make([]int, 0, 2)
    fmt.Printf("Initial capacity: %d\n", cap(s)) // Вывод: Initial capacity: 2
​
    // Добавляем элементы, чтобы превысить начальную емкость
    for i := 0; i < 10; i++ {
        s = append(s, i)
        fmt.Printf("After appending %d: length=%d, capacity=%d\n", i, len(s), cap(s))
    }
}

Объяснение кода

  • s := make([]int, 0, 2): Создаем слайс s с начальной длиной 0 и емкостью 2. Это значит, что в данный момент слайс не содержит элементов, но может вместить до 2 элементов без выделения новой памяти.

  • fmt.Printf("Initial capacity: %d\n", cap(s)): Выводим начальную емкость слайса, которая равна 2.

  • for i := 0; i < 10; i++: Запускаем цикл, который добавляет 10 элементов в слайс.

  • s = append(s, i): Добавляем элемент i в слайс. Если добавление элемента приводит к превышению текущей емкости, Go автоматически выделяет новый массив с увеличенной емкостью и копирует в него элементы.

  • fmt.Printf("After appending %d: length=%d, capacity=%d\n", i, len(s), cap(s)): После каждого добавления элемента выводим текущую длину и емкость слайса. Вы можете заметить, как емкость увеличивается в зависимости от текущего размера.

Этот механизм позволяет слайсам в Go быть эффективными и гибкими в использовании, обеспечивая баланс между производительностью и потреблением памяти.

Тема: Типы и коллекции
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки