单个变量是否存在编译器内存障碍?

gby*_*gby 9 c compiler-construction gcc

编译器内存障碍会产生影响,迫使编译器确保缓存在寄存器中的所有堆栈变量都在屏障之前写入内存.

例如,GCC有以下声明:

asm inline ("" : : : "memory");
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉编译器(特别是GCC,但我也对其他人感兴趣)只对特定变量做同样的效果?类似于以下想象的构造:

int x;
...
asm inline ("" : : : "memory(x)");
Run Code Online (Sandbox Code Playgroud)

具有预期的行为,即x和x的值仅被写入相应的存储器位置,如果它恰好被缓存在寄存器中.

原因是我有一个特定的变量,我需要确保它不会缓存在寄存器中,以便硬件引擎可以读取它的值.但是,完整的编译器内存屏障将强制编译器向内存写入在该时间点可能缓存在寄存器中的所有其他变量的值,这可能相当于我需要编写的更多数据.我想知道是否有更具体的东西.

提前致谢!

zvr*_*rba 5

尝试{ int y = x; *(volatile int*)&x = y; }并检查生成的组件.