_ReadWriteBarrier 如何在调用树中向上传播?
-
23-09-2019 - |
题
我正在看这段文字 文档 对于 Visual C++ 的 _ReadWriteBarrier 内在函数:
在Visual C ++编译器的过去版本中,_ReadWriteBarrier和_writeBarrier功能仅在本地执行,并且不影响呼叫树的功能。在Visual C ++ 2005及以后,这些功能一直在呼叫树上执行。
我理解屏障在函数中的作用,但“调用树上”似乎意味着函数 foo()
调用函数 bar()
可以知道是否 bar()
是否包含屏障。VC2005 中到底发生了什么变化才能实现这一点......调用约定/ABI、编译器完成的一些全局分析,或者什么?
解决方案
MS 文档从来都不是很好,这就是一个很好的例子。_ReadWriteBarrier 有 2 个部分:
- 告诉CPU做一个内存屏障(即mfence),
- 告诉编译器不要围绕屏障进行优化。
我怀疑调用树部分指的是#2。IE:
int x = 0;
void foo()
{
x = 7;
_ReadWriteBarrier();
x = 8;
}
如果没有屏障,x=7 可以被编译器完全删除。有了屏障,它就留下来了。现在,有一个函数怎么样 来电 富?
void bar()
{
x = 3; // optimized away?
foo();
x = 4;
}
我认为过去 x=3 可能已被优化掉(编译器很难判断是否允许),但现在它将正确保留 x=3 指令。
我认为。
不隶属于 StackOverflow