除其他外,编译器的内存屏障会迫使编译器确保将缓存在寄存器中的所有堆栈变量都写入到内存中。
例如,GCC有以下声明:
asm inline ("" : : : "memory");有没有办法告诉编译器(特别是GCC,但我也对其他编译器感兴趣)只对特定的变量执行相同的效果?类似于以下想象的构造:
int x;
...
asm inline ("" : : : "memory(x)");如果x和x的值碰巧被缓存在寄存器中,那么它的预期行为将被写入相应的内存位置。
原因是我有一个特定的变量,需要确保没有缓存在寄存器中,以便硬件引擎能够读取它的值。但是,一个完整的编译器内存屏障将迫使编译器向内存中写入的值--所有可能在该时间点缓存在寄存器中的其他变量--这些变量可能相当于比我需要编写的更多的数据。我想知道是否有更具体的东西。
提前感谢!
发布于 2012-01-17 14:18:24
尝试使用{ int y = x; *(volatile int*)&x = y; }并检查生成的程序集。
发布于 2012-01-17 16:27:16
由于您愿意使用gcc扩展,所以您可以使用扩展来处理该特性的原子指令:
__sync_bool_compare_and_swap(&myvar, 0, 0)如果变量已经是0 :),则将变量的值设置为0,此外,它还意味着该内存位置具有完全的顺序一致性。
发布于 2012-02-22 10:23:13
回顾lkml上的一个线程,单变量编译器唯一障碍的方法之一是:
#define forget(x) __asm__ __volatile__("":"=m"(x):"m"(x))https://stackoverflow.com/questions/8896092
复制相似问题