Лекция 59. std::launder. Strict aliasing. Constexpr переменные и функции

Поделиться
HTML-код
  • Опубликовано: 14 дек 2024

Комментарии • 6

  • @fiufiuf
    @fiufiuf 6 месяцев назад +3

    Спасибо за лекции! Я с volatile сталкивался при программировании микроконтроллеров, в частности AVR (это те, на которых работают всевозможные ардуины). Там volatile обычно объявляются глобальные переменные, которые изменяются в обработчиках прерываний. Простейший пример это счетчик срабатываний хардварного таймера. Так как обработка прерывания происходит "за пределами зоны видимости" компилятора, то нужно явно ему указать, что последовательное чтение одной и той же переменной может давать разные результаты.

  • @petrkiyashko4248
    @petrkiyashko4248 3 месяца назад +1

    Уб с интом и ll прежде всего потому, что есть little и big endian архитектуры, и при касте указателя интовый может на одном компе указывать на младшие разряды, а на другом -- на старшие

  • @bartholomewsimpson462
    @bartholomewsimpson462 6 месяцев назад +2

    volatile прежде всего применяется при объявлении элементов периферии. Пример: большинство микроконтроллеров имеют memory mapped IO. Фактически это означает, что регистры находятся в одном адресном пространстве с RAM, то есть к ним можно обращаться как к ячейкам памяти с определенными адресами. Однако, то, что лежит в этой памяти может изменяться из-вне. Банальный пример - это GPIO, настроенный на вход. Если физически изменять уровень на выводе, то и значение будет меняться, однако никакие инструкции для этого не используются, на уровне архитектуры так сделано. Именно по этой причине все регистры периферии помечены как volatile. Пример с прерыванием, приведенный другим комментатором аналогичен. Так как прерывание аппаратное, то вызов обработчика происходит по следующей схеме (AVR): аппаратно проверяется разрешено ли данное прерывание (к примеру разрешено) -> сохраняется PC -> PC заменяется на адрес соответствующего вектора -> по этому адресу лежит jmp на обработчик и происходит безусловный переход на обработчик. Компилятор ничего об этом не знает и поэтому при изменении переменных из прерываний требует запрета оптимизаций над ними, так как инструкции для изменения переменной существуют, однако могут быть вызваны в неожиданный момент.
    a = 5;
    *произошло прерывание a = 10;*
    a = a + 1;

    • @petrkiyashko4248
      @petrkiyashko4248 3 месяца назад

      В юзер-спейсе та же ситуация с обработкой сигналов

  • @idiotsiuda
    @idiotsiuda 6 месяцев назад

    Клёвый пример!

  • @VoiCedml
    @VoiCedml Месяц назад

    Илья, привет, спасибо за отличный курс лекций.
    Скажи, пожалуйста, почему убрал их из общего доступа? Планируешь ли восстановить доступ или его можно получить? Курс лекций за последний год был очень хорош на твоем канале.
    Так как не знаю, как с тобой связаться, пишу через комментарии :)