c - 单个变量是否存在编译器内存屏障?

标签 c gcc compiler-construction

编译器内存屏障的作用之一是强制编译器确保缓存在寄存器中的所有堆栈变量在屏障之前写入内存。

例如,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/

相关文章:

c++ - 为什么线程创建方法需要一个参数?

c - 外部函数原型(prototype)和静态定义

c++ - 使用 GCC 5.2.0 构建 Chromium : -Wstrict-overflow=1 warning

objective-c - 在 Objective - C 中不使用未使用的类导入很重要吗?

c - 函数指针中的 gcc 警告(不兼容的指针类型)

c - 如何使用另一个指针访问函数指针数组的元素并依次调用其中一个函数?

c++ - 为什么指针访问比 vector::iterator 访问慢? (编译器代码生成)

C++将int转换为字符串?

c - 尽管声明了 const 限定符,为什么嵌套结构成员会发生更改?

c - 编译和链接所有 C 文件的别名或命令