编译器内存屏障的作用之一是强制编译器确保缓存在寄存器中的所有堆栈变量在屏障之前写入内存。
例如,GCC有如下语句:
asm inline ("" : : : "memory");
有什么方法可以告诉编译器(特别是 GCC,但我对其他编译器也很感兴趣)只对一个特定 变量执行相同的操作?类似于以下想象的构造:
int x;
...
asm inline ("" : : : "memory(x)");
如果恰好缓存在寄存器中,x 和 x 的值将只写入相应的内存位置。
这样做的原因是我有一个特定的变量,我需要确保它没有缓存在寄存器中,以便硬件引擎可以读取它的值。但是,完整的编译器内存屏障将迫使编译器将当时可能缓存在寄存器中的所有其他变量的值写入内存,这些变量的数据量可能比我多得多需要写。我想知道是否有更具体的内容。
提前致谢!
最佳答案
尝试使用 { int y = x; *(volatile int*)&x = y; }
并检查生成的程序集。
关于c - 单个变量是否存在编译器内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896092/