它们由 libstdc++ 定义,具体取决于您的 GCC 安装,但对于最近的 GCC 版本,很容易找到:
$ cat t.cc
#include <ext/atomicity.h>
int main()
{
int i=0;
__gnu_cxx::__exchange_and_add(&i, 0);
}
$ g++ -g t.cc
$ gdb -quiet ./a.out
Reading symbols from /dev/shm/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x8570: file t.cc, line 5.
Starting program: /dev/shm/a.out
Temporary breakpoint 1, main () at t.cc:5
5 int i=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.16-33.fc18.armv7hl libgcc-4.7.2-8.fc18.armv7hl libstdc++-4.7.2-8.fc18.armv7hl
(gdb) n
6 __gnu_cxx::__exchange_and_add(&i, 0);
(gdb) step
__gnu_cxx::__exchange_and_add (__mem=0x7efff13c, __val=0)
at /usr/lib/gcc/armv7hl-redhat-linux-gnueabi/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:48
48 { return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
(gdb)
GDB 告诉你定义在哪里,在我的例子中它是在/usr/lib/gcc/armv7hl-redhat-linux-gnueabi/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h
ie 他们被内联定义在atomicity.h
从您发布的代码看来,您使用的是 GCC 4.1(相当旧),在这种情况下,函数是在库中定义的,而不是在标头中。该代码是特定于 CPU 的,因此它再次取决于您的 GCC 安装。代码可以在 GCC 源代码中找到,i386 实现在文件libstdc++-v3/config/cpu/i386/atomicity.h
中,i486 及更高版本的实现在libstdc++-v3/config/cpu/i486/atomicity.h