TGViewer
C++ Academy C++ Academy @cpluspluc · 15.5K subscribers
Post #1483 2.75K
volatile в C нужен не «для красоты», а чтобы компилятор не сломал работу с железом.

Когда код читает memory-mapped IO регистр, значение может измениться не из-за программы, а из-за устройства.

Например:


#define STATUS_REG (*(volatile uint32_t*)0x40000000)
#define READY_BIT (1 << 0)

while (!(STATUS_REG & READY_BIT)) {
// ждём, пока железо станет ready
}


Без volatile компилятор может решить:

«Значение не меняется внутри цикла, значит можно прочитать один раз».

И всё. Опрос регистра превращается в бесконечный цикл или вообще оптимизируется не так, как вы ожидали.

Главная мысль:

volatile говорит компилятору:
это значение может измениться вне твоего контроля, не трогай чтения и записи.

Важно: volatile не заменяет mutex, atomics и memory barriers. Но для MMIO-регистров это база, без которой embedded-код может вести себя как магия из ада.
  • ❤ 14
  • 🖕 3
  • 💊 1
More from @cpluspluc
  1. Sep 30, 2026✔️ В C/C++ есть любопытный трюк с AVX-512: `_mm512_maskz_loadu_epi8`. Инструкция может выб…
  2. Sep 28, 2026C23 сделал enum в C заметно удобнее для низкоуровневого кода. Раньше базовый тип перечисле…
  3. Sep 26, 2026Minimum-Cost Maximum-Flow всего в ~110 строках C++ Хороший компактный пример одного из сам…
  4. Sep 25, 2026🐧 Linux Cheat Sheet - шпаргалка по командам Linux Самая удобная шпаргалка по Linux и Bash…
  5. Sep 24, 2026photo post
  6. Sep 24, 2026`🤖 В SourceCraft появилась команда цифровых разработчиков Агентам можно назначать задачи…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →