来自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 = 1
和x = 2
之前执行,而且它可以可以进行优化(而不会违反常规规则)。
因此,我非常想知道如何正确应用GNU要求,我的理解是否存在问题?要求的书写方式有误吗?
也许应该这样写需求:
最低 要求是在某个顺序点具有副作用的之前,所有对易失性对象的访问均已稳定 并且没有后续访问发生
或者在评论中优雅地建议使用pmg:
最低要求是,在序列点上,以前所有对易失对象的 UNSEQUENCED 访问都必须具有 稳定,没有后续访问发生
因此我们可以仅将其应用于x = 1;
末尾和x = 2;
末尾的序列点上,在这之前,对易失对象的先前访问已经稳定并且没有后续访问发生吗?