Какой объем памяти занимает заголовок (структура) слайса в Go?

Ответ

Заголовок слайса в Go — это структура, которая сама по себе занимает фиксированный объем памяти, не зависящий от количества элементов в слайсе. Размер зависит от архитектуры процессора:

  • 24 байта на 64-битной архитектуре (3 поля по 8 байт).
  • 12 байт на 32-битной архитектуре (3 поля по 4 байта).

Эта структура определена в рантайме Go и содержит три поля:

// Фактическое определение в пакете runtime
type slice struct {
    array unsafe.Pointer // Указатель на нижележащий массив данных
    len   int            // Текущее количество элементов в слайсе
    cap   int            // Емкость (capacity) нижележащего массива
}

Проверить это можно с помощью пакета unsafe:

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    s := make([]int, 0, 10)
    fmt.Printf("Размер заголовка слайса: %d байтn", unsafe.Sizeof(s))
    // Вывод на 64-битной системе: 24 байт
}

Важно: unsafe.Sizeof(s) возвращает размер только самой структуры-заголовка, а не память, выделенную для данных, на которые он указывает. Память для элементов слайса (cap * размер_элемента) выделяется отдельно в куче.