🟡 Средний · 2 очк. Разное / продвинутое
Сколько байт занимает заголовок slice, string и interface на 64-bit платформе?
A Все по 8 байт
B slice = 24 (pointer + len + cap), string = 16 (pointer + len), interface = 16 (type + data pointer)
C slice = 16, string = 8, interface = 8
D Зависит от содержимого
Объяснение вопроса

Размеры заголовков основных типов на 64-bit платформе:

// slice header (reflect.SliceHeader): 24 байт
type SliceHeader struct {
    Data uintptr  // 8 байт - указатель на backing array
    Len  int      // 8 байт
    Cap  int      // 8 байт
}

// string header (reflect.StringHeader): 16 байт
type StringHeader struct {
    Data uintptr  // 8 байт - указатель на байты
    Len  int      // 8 байт
}

// interface (runtime.iface): 16 байт
type iface struct {
    tab  *itab    // 8 байт - указатель на таблицу методов + тип
    data unsafe.Pointer // 8 байт - указатель на данные
}

// Другие типы:
// int, uint, uintptr, pointer: 8 байт
// bool: 1 байт
// struct{}: 0 байт
// map: 8 байт (это указатель на runtime.hmap)
// chan: 8 байт (указатель на runtime.hchan)
// func: 8 байт (указатель)

Знание размеров важно для оценки потребления памяти: []string из 1 млн элементов занимает 24 + 1M*16 = ~16 МБ только на заголовки строк, без учета самих данных.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.