2

我正在查看Visual C++ 的 _ReadWriteBarrier 内在文档中的这段文字:

在 Visual C++ 编译器的过去版本中,_ReadWriteBarrier 和 _WriteBarrier 函数仅在本地强制执行,不会影响调用树上的函数。在 Visual C++ 2005 及更高版本中,这些函数在调用树中一直强制执行。

我了解障碍在函数中的作用,但“调用树”似乎暗示foo()调用函数的函数bar()可以知道是否bar()包含障碍。在 VC2005 中实际改变了什么来启用这个......调用约定/ABI,编译器完成的一些全局分析,还是什么?

4

1 回答 1

1

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

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

我怀疑调用树部分指的是#2。IE:

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 指令。

我认为。

于 2010-01-29T05:00:14.927 回答