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和其他系统组件的功能.只要它能够确保对符合规范的代码没有明显的后果,它就可以(几乎)在任何想要的时间(几乎)执行它.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...