我正在看这段文字 文档 对于 Visual C++ 的 _ReadWriteBarrier 内在函数:

在Visual C ++编译器的过去版本中,_ReadWriteBarrier和_writeBarrier功能仅在本地执行,并且不影响呼叫树的功能。在Visual C ++ 2005及以后,这些功能一直在呼叫树上执行。

我理解屏障在函数中的作用,但“调用树上”似乎意味着函数 foo() 调用函数 bar() 可以知道是否 bar() 是否包含屏障。VC2005 中到底发生了什么变化才能实现这一点......调用约定/ABI、编译器完成的一些全局分析,或者什么?

有帮助吗?

解决方案

MS 文档从来都不是很好,这就是一个很好的例子。_ReadWriteBarrier 有 2 个部分:

  1. 告诉CPU做一个内存屏障(即mfence),
  2. 告诉编译器不要围绕屏障进行优化。

我怀疑调用树部分指的是#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 指令。

我认为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top