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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章