【发布时间】:2016-11-22 10:23:38
【问题描述】:
C++ 参考说:http://en.cppreference.com/w/cpp/atomic/atomic
std::atomic 可以用任何 TriviallyCopyable 类型 T 实例化
但是以下示例在 g++ 6.2.0 下不起作用
#include <atomic>
#include <functional>
struct Test11 {
int x;
};
struct Test12 {
char x;
};
struct Test13 {
long x;
};
struct Test2 {
char x;
int y;
};
struct Test3 {
int y;
long x;
};
template<typename T, typename... ARGS>
void test(ARGS&& ... args) {
static_assert(std::is_trivially_copyable<T>::value);
std::atomic<T> a;
a.store(T{std::forward<ARGS>(args)...});
}
int main() {
test<Test11>(1);
test<Test12>('\1');
test<Test13>(1L);
test<Test2>('\1',2);
test<Test3>(1,2L);
return 0;
}
编译:g++-6 -std=c++14 -latomic test.cpp
/tmp/cchademz.o:在函数
std::atomic<Test3>::store(Test3, std::memory_order): test.cpp:(.text._ZNSt6atomicI5Test3E5storeES0_St12memory_order[_ZNSt6atomicI5Test3E5storeES0_St12memory_order]+0x3e): 未定义引用__atomic_store_16collect2:错误:ld 返回 1 个退出状态
g++-6 --version
g++ (Ubuntu 6.2.0-7ubuntu11) 6.2.0 20161018
尤其是我不明白为什么Test2 有效,而Test3 无效。
有什么想法吗?
编辑:添加了 -latomic 标志和 g++ 版本
【问题讨论】:
-
您是否尝试在编译行末尾偶然添加
-latomic?代码在 coliru 上编译得很好-latomic(g++6.2): coliru.stacked-crooked.com/a/fd421bd3d1715897 -
您可以尝试包含
吗? -
将
-latomic移动到最后工作。但为什么呢? -
@WaeCo
Test3是唯一一个大小大于8的结构(在标准架构上),因此编译器可能不需要特定的函数来存储大小小于的原子结构8 个字节(std::atomic<>::store可能专门用于小类型)。 -
@WaeCo 通常,如果您检查生成的 ASM(例如在 godbolt 上),您会看到最多 8 个字节,编译器使用
mov QWORD ...指令,但没有指令一次移动超过 8 个字节,这就是您需要自定义函数的原因。
标签: c++ c++11 g++ c++14 atomic