代码之家  ›  专栏  ›  技术社区  ›  timday

读写屏障如何向上传播调用树?

  •  2
  • timday  · 技术社区  · 16 年前

    我在看这段文字 documentation 对于Visual C++的读写屏障本质:

    在Visual C++的过去版本中 编译器、读写屏障和 _ WriteBarrier函数仅在本地强制执行,不影响 在调用树上运行。在视觉上 C++ 2005和以后,这些函数 一路强制执行 树。

    我理解屏障在函数中的作用,但是“向上调用树”似乎意味着函数 foo() 调用函数 bar() 可以知道是否 巴尔) 是否有障碍物。在VC2005中为实现这一点而发生的实际变化…调用约定/abi,编译器执行的一些全局分析,或者什么?

    1 回复  |  直到 16 年前
        1
  •  1
  •   tony    16 年前

    Docs女士从来都不好,这一个就是一个很好的例子。读写屏障有两部分:

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

    我想。