编译器内存屏障的作用之一是强制编译器确保缓存在寄存器中的所有堆栈变量在屏障之前写入内存。
例如GCC有如下声明:
asm inline ("" : : : "memory");
有什么方法可以告诉编译器(特别是 GCC,但我也对其他编译器感兴趣)仅对特定变量执行相同的效果?类似于以下想象的构造:
int x;
...
asm inline ("" : : : "memory(x)");
按照预期的行为,如果 x 和 x 的值恰好缓存在寄存器中,则只会将其写入相应的内存位置。
原因是我有一个特定的变量,我需要确保它没有缓存在寄存器中,以便硬件引擎可以读取它的值。然而,完整的编译器内存屏障将迫使编译器将当时可能缓存在寄存器中的“所有”其他变量的值写入内存,这可能会产生比我需要写入的更多的数据。我想知道是否有更具体的东西。 提前致谢!
{ int y = x; *(volatile int*)&x = y; }
并检查生成的组件。
__sync_bool_compare_and_swap(&myvar, 0, 0)
0
:),则会将变量的值设置为
0
:),此外还意味着该内存位置上的完全顺序一致性。#define forget(x) __asm__ __volatile__("":"=m"(x):"m"(x))