Память и раскладка типов
Стек и куча, размеры и выравнивание, типы нулевого размера, ниши, стоимость аллокаций, 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 источников.
Разделы
- Стек и куча
- Размеры и выравнивание
- Типы нулевого размера
- Ниши и раскладка
enum - Аллокации и их стоимость
Sizedи DST
Предыдущая тема: Тесты, бенчмарки, профилирование · Следующая тема: Инструментарий