在一个顺序点上,以前对易失性对象的所有访问均已稳定

时间:2019-01-17 09:06:47

标签: c gcc language-lawyer volatile sequence-points

来自GNU document关于volatile

  

最低要求是所有先前的序列点   对易失性对象的访问已稳定,此后没有任何访问   发生访问

好的,所以我们知道sequence point是什么,现在我们知道volatile在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 = 1x = 2之前执行,而且它可以可以进行优化(而不会违反常规规则)。

因此,我非常想知道如何正确应用GNU要求,我的理解是否存在问题?要求的书写方式有误吗?

也许应该这样写需求:

  

最低   要求是在某个顺序点具有副作用的之前,所有对易失性对象的访问均已稳定   并且没有后续访问发生

或者在评论中优雅地建议使用pmg:

  

最低要求是,在序列点上,以前所有对易失对象的 UNSEQUENCED 访问都必须具有   稳定,没有后续访问发生

因此我们可以将其应用于x = 1;末尾和x = 2;末尾的序列点上,在这之前,对易失对象的先前访问已经稳定并且没有后续访问发生吗?

0 个答案:

没有答案