首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单个变量是否存在编译器内存屏障?

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

Stack Overflow用户
提问于 2012-01-17 14:15:23
回答 4查看 2.7K关注 0票数 11

除其他外,编译器的内存屏障会迫使编译器确保将缓存在寄存器中的所有堆栈变量都写入到内存中。

例如,GCC有以下声明:

代码语言:javascript
运行
复制
asm inline ("" : : : "memory");

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

代码语言:javascript
运行
复制
int x;
...
asm inline ("" : : : "memory(x)");

如果x和x的值碰巧被缓存在寄存器中,那么它的预期行为将被写入相应的内存位置。

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

提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-17 14:18:24

尝试使用{ int y = x; *(volatile int*)&x = y; }并检查生成的程序集。

票数 5
EN

Stack Overflow用户

发布于 2012-01-17 16:27:16

由于您愿意使用gcc扩展,所以您可以使用扩展来处理该特性的原子指令:

代码语言:javascript
运行
复制
__sync_bool_compare_and_swap(&myvar, 0, 0)

如果变量已经是0 :),则将变量的值设置为0,此外,它还意味着该内存位置具有完全的顺序一致性。

票数 3
EN

Stack Overflow用户

发布于 2012-02-22 10:23:13

回顾lkml上的一个线程,单变量编译器唯一障碍的方法之一是:

代码语言:javascript
运行
复制
#define forget(x) __asm__ __volatile__("":"=m"(x):"m"(x))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8896092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档