来自 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值。
答案 0 :(得分:3)
因此,如果我在不使用读取的值的情况下读取了volatile(这是一个副作用),则实际上不需要此访问,并且可以对其进行优化。
不。文字显示“未使用其值,并且没有产生所需的副作用” 。它不会说“ 或”。无论您使用的是什么值,都会产生副作用-访问volatile变量。
因此可以优化读取访问权限(无需进一步使用获取的值)。
否。
现在,可以优化while循环吗?
不。所指的数据是挥发性限定的。在循环的每一圈,它必须直接从内存中读取*timer_reg
。它可能无法优化读取。它可能无法重新排序。它可能不会缓存/预取它。