Из GNU документа о volatile
:
Минимальное требование заключается в том, чтобы в точке последовательности все предыдущие
доступ к летучим объектам стабилизировался
доступы произошли
Хорошо, мы знаем, что такое точка последовательности s, и теперь мы знаем, как изменчиво ведет себя по отношению к ним в gcc.
Итак, наивно я бы посмотрел на следующую программу:
volatile int x = 0;
int y = 0;
x = 1; /* sequence point at the end of the assignment */
y = 1; /* sequence point at the end of the assignment */
x = 2; /* sequence point at the end of the assignment */
И будет применять требование GNU следующим образом:
В точке последовательности (конец y=1
) доступ к энергозависимому x = 1
стабилизируется, и доступ к подпоследовательности x = 2
не произошел.
Но это просто неправильно, потому что нелетучие y = 1
могут быть переупорядочены по точкам последовательности, например, y = 1
может фактически выполняться до x = 1
и x = 2
, и, кроме того, его можно оптимизировать (не нарушая как-будто правило).
Так что я очень хочу узнать, как правильно применить требование GNU, есть ли проблемы с моим пониманием? неправильно написано требование?
Может быть, это требование должно быть записано примерно так:
минимальный
Требуется, чтобы в точке последовательности , КОТОРЫЙ ИМЕЕТ ПОБОЧНЫЙ ЭФФЕКТ , все предыдущие обращения к изменчивым объектам стабилизировались
и никаких последующих обращений не произошло
Или, как элегантно предложено в комментарии pmg:
Минимальное требование состоит в том, чтобы в точке последовательности все НЕПРАВИЛЬНЫЕ предыдущие обращения к изменчивым объектам имели
стабилизировался и никаких последующих обращений не произошло
чтобы мы могли только применять его к точкам последовательности конца x = 1;
и конца x = 2;
, что, безусловно, верно, что предыдущие обращения к изменчивым объектам стабилизировались, и никаких последующих обращений не произошло