Константные указатели и выравнивание
Выражайте доступ только для чтения и размещение в памяти.
«Константные указатели и выравнивание» — бесплатный урок Zig Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.
Доступ только для чтения
Часто нужно предоставить доступ к значению, гарантируя, что оно не будет изменено. Указатель const разрешает чтение, но запрещает запись.
Тип *const T
Указатель на неизменяемые данные записывается как *const T. Вы можете читать данные через него, но присваивание его целевому объекту вызовет ошибку компиляции.
const x: i32 = 5;
const p: *const i32 = &x;Const следует за &
Взятие адреса константного значения автоматически создаёт *const T, поэтому неизменяемость сохраняется в типе.
const v: u8 = 9;
const p = &v; // *const u8Изменяемый указатель приводится к константному
*T свободно приводится к *const T, поскольку отказ от права записи всегда безопасен. Обратное преобразование запрещено.
var n: i32 = 1;
const ro: *const i32 = &n;Зачем предпочитать const
Параметр типа *const T сообщает вызывающему коду, что Вы будете только читать данные, благодаря чему функциям проще доверять.
fn show(p: *const i32) void {
// read only
}Что означает выравнивание
У каждого типа есть выравнивание: граница адреса, на которой он должен располагаться. Для u32 обычно требуется адрес, кратный четырём.
Запрос с помощью @alignOf
Встроенная функция @alignOf(T) возвращает требуемое выравнивание типа в байтах, так же как @sizeOf возвращает его размер.
const a = @alignOf(u32);Выравнивание в типе
Вы можете указать выравнивание указателя в его типе с помощью align, например *align(4) u8, потребовав определённую границу.
var p: *align(4) u8 = undefined;Почему выравнивание важно
Оборудование быстрее читает выровненные данные, а некоторые процессоры выдают ошибку при невыровненном доступе. Zig отслеживает выравнивание в типе, чтобы обеспечить корректность.
Избыточное и недостаточное выравнивание
Указатель может гарантировать более строгое выравнивание, чем требуется по умолчанию, но ослабить его можно только с помощью явного приведения, например @alignCast.
Const и align вместе
Эти свойства естественно сочетаются: *const align(8) T — это указатель только для чтения, который также гарантирует границу в восемь байт.
Быстрая проверка
Вы пишете функцию, которой нужно только прочитать значение, находящееся за указателем. Какой тип параметра лучше всего это выражает?
Итоги
Указатель *const T предоставляет доступ к данным только для чтения и приводится из *T, а выравнивание, задаваемое через @alignOf и align(n), обеспечивает корректный и быстрый доступ к памяти. 🎯
Часто задаваемые вопросы
Урок «Константные указатели и выравнивание» бесплатный?
Да — полный текст урока «Константные указатели и выравнивание» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.
Чему я научусь в уроке «Константные указатели и выравнивание»?
Выражайте доступ только для чтения и размещение в памяти. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Zig Academy?
Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Константные указатели и выравнивание»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Zig Academy?
Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Указатели на один элемент с помощью *T
- Разыменование с помощью ptr.*
- Указатели на несколько элементов [*]T
- Константные указатели и выравнивание