Интерфейс распределителя памяти
Один контракт для всех источников памяти.
«Интерфейс распределителя памяти» — бесплатный урок Zig Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.
Один распространённый тип
Каждый allocator в Zig передаётся как один тип — std.mem.Allocator. Ваш код взаимодействует только с этим интерфейсом, а не с конкретной реализацией.
const Allocator = std.mem.Allocator;Интерфейс, а не класс
std.mem.Allocator — это небольшой интерфейс: указатель и таблица функций. Он описывает возможности allocator, а не указывает, какой именно allocator используется.
Много реализаций, одна форма
Page allocator, арена или allocator для тестирования имеют одну и ту же форму. Чтобы заменить один другим, не нужно менять вызывающий код.
Получите настоящий allocator
Сначала получите конкретный allocator, а затем возьмите его дескриптор .allocator(), чтобы передавать его как универсальный тип std.mem.Allocator.
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const a = gpa.allocator();Передавайте его дальше
Получив allocator, передавайте это значение в любую функцию, которой нужна память. Вся программа может использовать один источник памяти.
try doWork(a);Page allocator
std.heap.page_allocator напрямую запрашивает память у OS. Он прост, но работает крупными блоками, поэтому подходит для больших или долгоживущих блоков, а не для маленьких.
const a = std.heap.page_allocator;GeneralPurposeAllocator
GeneralPurposeAllocator — повседневный выбор в отладочных сборках. Он отслеживает каждый блок и сообщает об утечках и повторном освобождении памяти.
Зачем нужен интерфейс
Если программировать через интерфейс, функция будет работать с любым allocator. Один и тот же код можно запускать в тестах, на bare metal или на сервере.
Функции просто запрашивают allocator
Функции не важно, какой allocator ей передали. Она просто вызывает такие методы, как alloc и free, у переданного ей std.mem.Allocator.
const buf = try a.alloc(u8, 16);Глобального allocator нет
В Zig нет одной глобальной кучи. Вы сами решаете, какой allocator использует каждая часть программы, поэтому источники памяти остаются явными и локальными.
Тестируйте с другим allocator
В тестах вместо него передавайте std.testing.allocator. Код остаётся тем же, но теперь утечки приводят к провалу теста — это доказывает пользу интерфейса. ✅
Быстрая проверка
Подумайте, какой тип объединяет все allocator в Zig.
Итоги
Вы узнали, что std.mem.Allocator — это один интерфейс для множества реализаций, поэтому код, запрашивающий память, работает с любым переданным вами allocator. 🎯
Часто задаваемые вопросы
Урок «Интерфейс распределителя памяти» бесплатный?
Да — полный текст урока «Интерфейс распределителя памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.
Чему я научусь в уроке «Интерфейс распределителя памяти»?
Один контракт для всех источников памяти. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Zig Academy?
Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Интерфейс распределителя памяти»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Zig Academy?
Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Почему в Zig нет скрытых выделений памяти
- Интерфейс распределителя памяти
- alloc, free, create и destroy
- Динамические списки с ArrayList