g ++源中定义的`__atomic_compare_exchange`在哪里?

时间:2016-06-02 03:16:52

标签: c++ atomic

在我系统中文件/usr/include/c++/4.9/atomic下的g ++源代码中,函数atomic::compare_exchange_strong具有以下正文。

  bool
  compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, 
              memory_order __f) noexcept
  {
return __atomic_compare_exchange(&_M_i, &__e, &__i, false, __s, __f); 
  }

但是,此文件仅包含bits/atomic_base.h,我在此文件中找不到__atomic_compare_exchange的定义。

__atomic_compare_exchange定义在哪里?

2 个答案:

答案 0 :(得分:2)

__atomic_compare_exchange是内置的编译器。它实际上并没有在头文件中定义 - 编译器本身知道它是什么。

在GCC源本身中,它在sync-builtins.def中声明。我不熟悉GCC的来源,所以我不确定它是如何渗透到特定于体系结构的实现(虽然它似乎可能通过maybe_emit_atomic_exchange),但是例如表示它的x86指令可以在另一个名为sync.md的特定于平台的生成器文件中找到:

(define_insn "atomic_exchange<mode>"
  [(set (match_operand:SWI 0 "register_operand" "=<r>")     ;; output
    (unspec_volatile:SWI
      [(match_operand:SWI 1 "memory_operand" "+m")      ;; memory
       (match_operand:SI 3 "const_int_operand")]        ;; model
      UNSPECV_XCHG))
   (set (match_dup 1)
    (match_operand:SWI 2 "register_operand" "0"))]      ;; input
  ""
  "%K3xchg{<imodesuffix>}\t{%1, %0|%0, %1}")

答案 1 :(得分:0)

它可能是编译器内在的 - 编译器本身采用和使用的东西,而不是纯库解决方案。为了实现完整的标准库(例如某些类型特征),有些编译器帮助是必要的,而在其他情况下,编译器可以做得更好,例如std::make_index_sequence,最近有更多的处理为了表现出非小的价值。