微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C编译器优化器是否会违反短路并重新排序逻辑AND表达式中操作数的内存访问?

我们知道逻辑AND运算符(&&)可以保证从左到右的评估.

但我想知道编译器优化器是否可以在以下代码中重新排序* a和b-> foo的存储器访问指令,即优化器在访问* a之前写入尝试访问* b的指令.

(考虑a和b都是指向堆中内存区域的指针.)

if (*a && b->foo) {
  /* do something */
}

有人可能认为&&导致序列点,所以编译器必须在访问* b之前发出访问* a的指令但是在https://stackoverflow.com/a/14983432/1175080读完接受的答案后,我不太确定.如果你看一下这个答案,语句之间有分号,它们也会建立序列点,因此它们也应该阻止重新排序,但是答案似乎表明它们需要编译器级别的内存屏障,尽管存在分号.

我的意思是,如果你声称&&建立一个序列点,然后在https://stackoverflow.com/a/14983432/1175080代码中对于分号是正确的.那么为什么在该代码中需要编译器级别的内存屏障?

解决方法

系统可以评估b-> foo,直到它达到超出其推测性执行能力的某个时间.大多数现代系统可以处理推测性故障,如果事实证明从未使用过操作结果,则忽略该故障.

因此,它完全取决于编译器,cpu和其他系统组件的功能.只要它能够确保对符合规范的代码没有明显的后果,它就可以(几乎)在任何想要的时间(几乎)执行它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐