在C++ 标准 2014 年 11 月工作草案的29.5 原子类型中,它指出:
- 有一个通用类模板原子。模板参数 T 的类型应该是可简单复制的(3.9)。[注意:不能静态初始化的类型参数可能难以使用。——尾注]
所以 - 据我所知 - 这个:
#include <atomic>
struct Message {
unsigned long int a;
unsigned long int b;
};
std::atomic<Message> sharedState;
int main() {
Message tmp{1,2};
sharedState.store(tmp);
Message tmp2=sharedState.load();
}
应该是完全有效的标准 c++14(以及 c++11)代码。但是,如果我不libatomic
手动链接,命令
g++ -std=c++14 <filename>
给出 - 至少在 Fedora 22 (gcc 5.1) - 以下链接错误:
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status
如果我写
g++ -std=c++14 -latomic <filename>
一切都很好。我知道该标准没有说明必须包含的编译器标志或库,但到目前为止,我认为任何符合标准的单文件代码都可以通过第一个命令进行编译。
那么为什么这不适用于我的示例代码呢?是否有一个合理的原因-latomic
仍然是必要的,或者它只是编译器维护人员尚未解决的问题?