ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
986850 Топик полностью
йцyкeн (17.03.2020 15:48, просмотров: 421) ответил fk0 на Читать не последовательно, в другом порядке?  Не уверен, не должен. А вот вынести запись в конец функции и выполнить в последнюю очередь, на выходе -- запросто может. Т.е. переупорядочить относительно других инструкций и, в частности, относительно обращений к памяти (по указателям и т.п.)   Если порядок относительно других обращений к памяти важен, то следует использовать memory barriers. На сахаре уже 10 раз писали:
Если я правильно понимаю то, что написано на cppreference, компилятор не может изменять порядок доступа к двум volatile, но может переставлять запись/чтение volatile и обычной переменной. cv

Все IO регистры и так объявлены volatile, а переменные, порядок доступа к которым важен, можно либо тоже сделать volatile, либо читать/писать специально обученными функциями, типа такого:

template <typename T>
inline T volatile_read(const T& x) { return *(const_cast<const volatile T*>(&x)); }
template <typename T> 
inline void volatile_write(T& y, T x) { *(const_cast<volatile T*>(&y)) = x; }