【发布时间】:2019-06-19 08:52:09
【问题描述】:
我想看看std::atomic 是如何翻译成汇编的。为此,我编写了以下代码,但有些地方我不明白。
以下代码:
int main(void)
{
std::atomic<int> a;
a.fetch_add(0);
return 0;
}
由 GCC 编译为:
1 | push rbp
2 | mov rbp, rsp
3 | mov DWORD PTR [rbp-4], 0
4 | mov DWORD PTR [rbp-8], 5
5 | mov edx, DWORD PTR [rbp-4]
6 | lea rax, [rbp-12]
7 | lock xadd DWORD PTR [rax], edx
8 | mov eax, 0
9 | pop rbp
10| ret
为什么 GCC 将“5”(第 4 行)压入堆栈?
【问题讨论】:
-
尝试使用优化进行编译。现场稍作修改:godbolt.org/z/4pio0o(确保使用
a) -
这似乎只在对象上使用
fetch_add()时添加,即使godbolt 将其标记为std::atomic声明的结果。不知道它是什么。 godbolt.org/z/6p89Xd -
我怀疑,
5是memory_order_seq_cst 模式的值。