在这个例子中:
volatile uint32_t * pOne = 0xDEADBEEF;
volatile uint32_t * pTwo = 0x0BADC0DE;
void same(void)
{
uint32_t tmp;
tmp = *pOne; // A
*pOne = 0; // B
*pOne = tmp; // C
}
void different(void)
{
uint32_t tmp;
tmp = *pOne;
*pOne = 0; // E
*pTwo = 0; // F
*pOne = tmp;
}
据我所知,C99 编译器不允许对 lines和in重新排序A
,因为它们都引用同一个 volatile 对象。
但是线条和功能呢?它们与不同的易失性对象交互。B
C
same()
E
F
different()
- 是否允许 C99 编译器重新排序行
E
和F
?
我无法在标准本身中找到答案,因为第 5.1.2.3 节让我有点困惑。所以如果你能解释一下,我会很高兴的。
我知道这仅涉及编译器的重新排序,不会影响处理器的任何重新排序。
那么是否有一个标准库(如果实现)提供内存屏障?
目前我坚持使用C99,但出于好奇:C11有什么变化吗?