可以优化这种易失性访问吗?

时间:2019-04-03 11:19:54

标签: c optimization language-lawyer volatile

来自 ISO / IEC 9899:201x 部分 5.1.2.3程序执行:

  

2 访问易失性对象,修改对象,修改文件,   或调用执行所有这些操作都是的函数   效果,即执行状态的变化   环境。对表达式的评估通常包括   值计算和副作用的产生。价值计算   对于左值表达式,包括确定   指定对象。

因此,访问(读\写)挥发物称为副作用。 让我们继续:

  

4在抽象机中,所有表达式均按指定值求值   通过语义。 实际实施无需评估   如果表达式可以推断出未使用其值并且没有   产生所需的副作用(包括由调用   功能或访问易失性对象)

因此,如果我读取了一个volatile(这是一个副作用),但对读取的值不做任何事,则实际上不需要这种访问,并且可以对其进行优化。

好,也:

  

6对符合标准的实现的最低要求是:

     
      
  • 严格根据以下内容评估对易失对象的访问:   抽象机规则

  •   
  • 在程序终止时,所有数据   写入文件应与执行以下命令的结果相同   根据抽象语义编写的程序。

  •   
  • 交互式设备的输入和输出动态   如7.21.3所述。这些要求的目的是   无缓冲或行缓冲的输出会尽快出现,以   确保提示消息实际上出现在程序之前   等待输入。这是程序的可观察行为。

  •   

因此,据我了解,第 4 节是抽象机器的规则,而 6 节说,挥发物必须严格按照抽象机器规则进行评估( 4 是哪个部分)。因此,可以优化读取访问权限(无需进一步使用获取的值)。

所以,看一下这段代码:

volatile int *timer_reg = REGISTER_ADDRESS_CONST;
while (*timer_reg  == 0) {/*empty loop*/}

该代码将阻止执行,直到硬件在timer_reg所指向的地址上提高一位为止。该寄存器用作一种定时器,该定时器被配置为在经过一定时间后加一点。计时器结束后,繁忙的等待结束,执行继续。

现在,可以while循环进行优化了吗?我已经在许多具有不同优化级别的在线编译器上进行了尝试,但似乎没有。 我在这里想念什么吗?据我了解,标准明确表示可以对其进行优化。

编辑:我的观点是,由于while循环为空,也许编译器可以认为不需要的volatile值。

1 个答案:

答案 0 :(得分:3)

  

因此,如果我在不使用读取的值的情况下读取了volatile(这是一个副作用),则实际上不需要此访问,并且可以对其进行优化。

不。文字显示“未使用其值,并且没有产生所需的副作用” 。它不会说“ ”。无论您使用的是什么值,都会产生副作用-访问volatile变量。

  

因此可以优化读取访问权限(无需进一步使用获取的值)。

否。

  

现在,可以优化while循环吗?

不。所指的数据是挥发性限定的。在循环的每一圈,它必须直接从内存中读取*timer_reg。它可能无法优化读取。它可能无法重新排序。它可能不会缓存/预取它。