将易失性分配给非易失性语义和C标准

问题描述 投票:0回答:1
volatile int vfoo = 0;
void func()
{
    int bar;
    do
    {
        bar = vfoo;  // L.7
    }while(bar==1);
    return;
}

此代码忙于等待变量变为1。如果在第一遍中vfoo未设置为1,我会卡在里面吗。

此代码编译时没有警告。标准对此有何说法?

  • vfoo声明为volatile。因此,应not优化对该变量的读取。
  • 但是,bar是not volatile限定的。是否允许编译器优化对此bar的写入?即编译器将对vfoo进行读取访问,并允许丢弃此值而不将其分配给bar(在L.7)。
  • 如果是在特殊情况下标准有话要说,您能否包括该条款并解释标准的律师谈话?
c volatile ansi non-volatile
1个回答
0
投票

volatile变量必须在任何访问中读取。在您的代码片段中,无法优化此读取。编译器知道bar可能会受到副作用的影响。这样就可以正确检查条件。

https://godbolt.org/z/nFd9BB

© www.soinside.com 2019 - 2024. All rights reserved.