【发布时间】:2019-11-11 10:52:22
【问题描述】:
volatile int vfoo = 0;
void func()
{
int bar;
do
{
bar = vfoo; // L.7
}while(bar!=1);
return;
}
此代码忙-等待变量变为1。如果第一次通过时vfoo 没有设置为1,我会被卡在里面吗?
此代码在没有警告的情况下编译。 标准对此有何评论?
-
vfoo被声明为volatile。因此,对此变量的读取应该不进行优化。 - 但是,bar 不
volatile合格。是否允许编译器优化对此bar的写入? 。IE。编译器将对vfoo进行读取访问,并且允许丢弃该值而不将其分配给bar(在L.7)。 - 如果这是标准有话要说的特殊情况,能否请您包括该条款并解释标准的律师谈话?
【问题讨论】:
-
如何“优化写入
bar”?为了做到这一点,它写入的值必须提前知道,但该值是加载vfoo的结果,因为vfoo是易变的,所以不能省略。 -
"如果第一次通过时 vfoo 没有设置为 1,我会不会被卡在里面。"你如何测试它?
-
1) 正确。 2)
bar的类型无关紧要,不允许编译器优化vfoo的读取。 3) 不,这不是特例,并且 100% 定义明确。
标签: c language-lawyer volatile non-volatile