当我编译指令__atomic_add_fetch时会发生什么

Pen*_*ala 1 c++ gcc atomic clang android-x86

我的代码调用函数__atomic_add_fetch中有一条指令。编译此代码时,出现如下编译错误

错误:未定义对'__atomic_fetch_add_8'的引用

我真的不明白为什么我在调用__atomic_add_fetch时会抛出对__atomic_fetch_add_8的未定义引用。有人可以帮我理解在编译此代码时到底发生了什么吗?

注意:我特别希望了解“内部发生了什么,将__atomic_add_fetch转换为__atomic_fetch_add_8”。不是解决编译问题的解决方案。

PSk*_*cik 8

您应该使用标准化的atomic_fetch_add

在任何情况下,看起来您__atomic_fetch_add具有给定参数类型(大概为8个字节的整数)的您都无法解析为平台上的汇编指令,因此它正在解析为您需要针对其进行的函数调用链接libatomic-latomic)。

详细编辑:

在gcc上,__atomic_fetch_add似乎是用于实现stdatomic.h的内置编译器atomic_fetch_and_explicit(这只是它的一个简单宏名)。如前所述,您实际上应该使用标准名称atomic_fetch_add_explicit,而不__atomic_fetch_add是非便携式的实现细节。

无论如何,问题似乎是gcc和clang不在atomic_fetch_and_explicitARM上使用指令来实现(与ARM64或x86-64不同),而是它们从libatomic库中生成了对(使用全局锁的)函数的调用。该函数的名称似乎是从您尝试fetch_add到的整数(__atomic_fetch_add_8如果您是fetch_adding到_Atomic uin64_t __atomic_fetch_add_4fetch_adding到_Atomic uin32_t等等)中的字节数派生的。

https://gcc.godbolt.org/z/S67g7b

  • @Pendyala-`__atomic_fetch_add`不是标准C ++的一部分。该名称以两个下划线开头,因此该名称保留供实现使用。似乎您正在查看实现细节。使用`atomic_fetch_add`。 (4认同)