我们知道逻辑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的代码中对于分号是正确的.那么为什么在该代码中需要编译器级别的内存屏障?