BorrowCheck › Ядро языка Rust

Память и раскладка типов

Стек и куча, размеры и выравнивание, типы нулевого размера, ниши, стоимость аллокаций, Sized и DST.

Тема объясняет, где живут значения и сколько места они занимают. Раздел о стеке и куче разбирает, почему Vec находится в двух местах сразу, сколько стоит перемещение массива и Box, чем опасен большой массив на стеке и чем ограничен стек потока. Вопросы о размерах и выравнивании (alignment) проверяют выравнивающие байты (padding), перестановку полей в repr(Rust) и то, чего эта раскладка не гарантирует, выравнивание u128 и способы измерить раскладку через size_of и align_of. Разделы о типах нулевого размера (zero-sized types, ZST) и нишах (niches) показывают, почему HashSet устроен как HashMap<K, ()>, как Box и указатели работают с ZST, почему Option<&T> ничего не стоит, а сырой указатель ниши не имеет, и как bool, char и NonZero дают место для дискриминанта. Раздел об аллокациях разбирает, что на самом деле вызывает аллокатор: пустые контейнеры, рост Vec, collect с size_hint, into_boxed_slice, Rc::new и Rc::clone, конкатенация строк. Последний раздел посвящён Sized и типам динамического размера (dynamically sized types, DST): где DST не может находиться, что означает ?Sized, как устроена структура с безразмерным хвостом и что возвращает size_of_val для trait object.

43 вопроса: базовый уровень — 19, средний — 20, углублённый — 4. 6 справок, 7 источников.

Разделы

  1. Стек и куча
  2. Размеры и выравнивание
  3. Типы нулевого размера
  4. Ниши и раскладка enum
  5. Аллокации и их стоимость
  6. Sized и DST

Предыдущая тема: Тесты, бенчмарки, профилирование · Следующая тема: Инструментарий