我正在documentation查看Visual C ++的_ReadWriteBarrier内在函数中的这段文字:
在以前版本的Visual C ++中 编译器,_ReadWriteBarrier和 _WriteBarrier函数仅在本地强制执行且不受影响 用于调用树。在视觉中 C ++ 2005及更高版本,这些函数 一直强制执行 树。
我理解屏障在函数中的作用,但“调用树”似乎意味着调用函数foo()
的函数bar()
可以知道bar()
是否包含障碍与否。在VC2005中实际改变了什么来启用这个...调用约定/ ABI,编译器完成的一些全局分析,或者是什么?
答案 0 :(得分:1)
MS文档从来都不是很好,这个就是一个很好的例子。 _ReadWriteBarrier有两个部分:
我怀疑调用树部分是指#2。即:
int x = 0;
void foo()
{
x = 7;
_ReadWriteBarrier();
x = 8;
}
没有屏障,编译器可以完全删除x = 7。有了屏障,它就会停留。 现在,调用 foo?
的函数怎么样?void bar()
{
x = 3; // optimized away?
foo();
x = 4;
}
我认为过去x = 3可能已被优化掉了(编译器很难判断是否允许),但现在它会正确地保留x = 3指令。
我想。