В точке последовательности все предыдущие обращения к изменчивым объектам стабилизировались - PullRequest
0 голосов
/ 17 января 2019

Из 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;, что, безусловно, верно, что предыдущие обращения к изменчивым объектам стабилизировались, и никаких последующих обращений не произошло

...