Найти тему
Ржавый код

Компоновка памяти

Байтовые представления общих типов.

Базовые типы

Основные типы встроены в ядро языка.

Безнаковые типы

-2

Типы со знаком

-3
-4

Типы с плавающей точкой

Представление битовой выборки для f32:

-5

Разъяснение:

-6
-7

Преобразование типа через as

-8

Арифметические подводные камни

-9

Выражение _100 означает все, что может содержать значение 100, например, 100_i32, но является непрозрачным для компилятора.

Текстовые типы

-10

Базовые:

-11

Применение:

-12
-13

Кодирование

-14
-15

Пользовательские типы

Основные типы, определяемые пользователем. Актуальное представление объекта.

-16

Следует также отметить, что два типа A(X, Y) и B(X, Y) с точно такими же полями, могут иметь различную структуру; transmute() не гарантирует расположение.

Ссылки и указатели

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

-17

Должна быть задана допустимая величина 'T', и любая такая переменная должна существовать по крайней мере 'а.

Метаданные указателя

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

-18

Нет метаданных. (указатель тонкий).

-19

Если T является структурой, такой как S {x: [u8]} метаданные поля len является числом. размер контента.

-20

Регулярная ссылка среза (т.е. ссылочный тип среза [T]) часто рассматривается как &[T].

-21

Ссылка на строковый фрагмент (т. е. ссылочный тип строкового типа str), причем метаданные len является длиной среза.

-22

Метаданные указывают на таблицу vtable, где Drop::drop(), Trait::f(), ... являются указателями на их соответствующий impl для Т.

Замыкания

Функции с автоматически управляемым захватом блоков данных. Например, если у вас:

-23

Немного упрощенная функция, это замыкание, является удобной для записи «мини-функцией», которая принимает параметры, но также имеет некоторые локальные переменные для выполнения своей работы. Этот тип (содержит нужные локальные переменные) в функции. «Захват переменных» - это модный способ сказать, что замыкание удерживает локальные переменные, либо по перемещенному значению, либо по указателю.

Генерируемые анонимные замыкания типов C1 и C2, переданные в with_closure(), будут выглядеть следующим образом:

-24

Также создает анонимные функции, такие как f$_c$$_1$ (C1, X) или f$_c$$_2$ (& C2, X). Подробности зависят от того, какие FnOnce, FnMut, Fn... поддерживается на основе свойств используемых типов.

Типы переменных стандартной библиотеки

Стандартная библиотека rust объединяет вышеперечисленные примитивные типы c другими типами с особой семантикой, например:

-25

Волшебный тип, допускающий совмещенную мутабельность.

-26

Позволяет T's перемещаться внутрь и наружу.

-27

Также поддерживают динамическое заимствование T. Cell работает с Send, но не с Sync.

-28

Запрещает T::drop() быть вызванным.

-29

Этот тип аналогично.

-30

Тег может быть опущен для определенных T, например NonNull.

-31

Либо некоторая ошибка E, либо значение T.

-32

Неинициализированная память или некоторые Т. Это легальный способ работы с неинициализированными данными.

Хранение коллекций

-33

Для некоторых T стек-прокси может нести метаданные (например, Box<[T]>).

-34

Вектор массива значений одного типа.

-35

Элементы head и tail имеют значение null или указывают на узлы на куче. Каждый узел может указывать на свой предыдущий и следующий узел.

-36

Заголовок индекса выбирает массив в качестве кольцевого буфера. Это означает, что содержимое может быть несмежным и пустым посередине, как показано выше.

Другие коллекции

-37

Сохраняет ключи и значения в куче в соответствии с хеш-значением. HashSet идентичен HashMap, просто типа V нет. Представление кучи значительно упрощено.

-38

В куче сохранен массив с 2N элементами на слой. Каждый Т может иметь 2 нижестоящих элемента в слое ниже. Каждый Т выше своего

ребенка.

Другие строки

-39

Обратите внимание, чем строка отличается от &str и &[char].

-40

NUL-окончание, но без NUL в середине.

-41

Инкапсулирует, как работает операционная система представляя строки (например, WTF-8 в Windows).

-42

Инкапсулирует, как работает операционная система представляя пути.

Совместное владение

Если тип не содержит Cell for T, то это часто комбинируется с одним из типов Cell (тип для примера), чтобы обеспечить общую фактическую мутабельность.

-43

Совместное владение T в одном потоке. Для разрешения мутации требуется вложенное значение или ссылка на него. Это не передача и не синхронизация.

-44

То же самое, но разрешить совместное использование между потоками, если они содержат T, это передача или синхронизация.

-45

Внутренние поля зависят от платформы. Должны удерживается в Arc для разделения между разъединенными потоками, или через scope() для потоков с областью действия.

Статья на list-site.