из спецификации (6.7.3.6)
Объект, имеющий тип volatile-qualified, может быть изменен способами, неизвестными реализации или иметь другие неизвестные побочные эффекты. Поэтому любое выражение, относящееся к такому объекту, должно оцениваться строго в соответствии с правилами абстрактной машины, как описано в 5.1.2.3. Кроме того, в каждой точке последовательности значение, сохраненное последним в объекте, должно соответствовать значению, предписанному абстрактной машиной, за исключением случаев, когда оно изменено неизвестными факторами, упомянутыми ранее. То, что составляет доступ к объекту, имеющему тип с изменяемыми значениями, определяется реализацией.
Получение / установка значения будет считаться «доступом» в большинстве, если не во всех реализациях.
А из 5.1.2.3:
Доступ к энергозависимому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любую из этих операций, являются побочными эффектами, которые являются изменениями в состоянии среды выполнения. Оценка выражения может привести к побочным эффектам. В определенных точках в последовательности выполнения, называемых точками последовательности, все побочные эффекты предыдущих оценок должны быть завершены, и никаких побочных эффектов последующих оценок не должно быть. (Краткое описание точек последовательности приведено в приложении С.)
В абстрактной машине все выражения оцениваются в соответствии с семантикой. Реальная реализация не должна оценивать часть выражения, если она может сделать вывод, что его значение не используется и что не возникает никаких побочных эффектов (включая любые, вызванные вызовом функции или доступом к энергозависимому объекту).
Каждое присвоение является точкой последовательности, поэтому, если реализация не «выводит, что никакие побочные эффекты не возникают» из изменчивого доступа, это означает, что эти строки не могут быть переупорядочены в реализации, поскольку это не имело бы тот же смысловой смысл.
Конечно, многие компиляторы не соответствуют стандартам на 100%.
Здесь вы можете увидеть выходные данные ассемблера с различными компиляторами: https://godbolt.org/z/b0TNmT.
GCC, Clang и MSVC не переупорядочивают операции чтения и записи в сборке. (Хотя я не уверен, что это означает для реального исполняемого файла)