在我系统中文件/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
定义在哪里?
答案 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
,最近有更多的处理为了表现出非小的价值。