我想看看 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 行)压入堆栈?
最佳答案
如果您使用 Richard Critten 在评论中非常有用地发布的 godbolt 链接,并将 GCC 命令行更改为使用 -O0
,文字 5 将重新出现。很明显,它也出现在
std::__atomic_base<int>::operator int() const:
push rbp
mov rbp, rsp
sub rsp, 32
...
mov DWORD PTR [rbp-12], 5
mov eax, DWORD PTR [rbp-12]
mov esi, 65535
mov edi, eax
call std::operator&(std::memory_order, std::__memory_order_modifier)
因此文字 5
最终作为参数传递给该调用,在 %edi
中。
因为参数是std::memory_order
,我们可以看看documentation看看
typedef enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
} memory_order;
从字面上看,它会给出 memory_order_seq_cst = 5
。
请注意,memory_order_seq_cst
是 fetch_add
的默认值的排序参数,因此您希望看到它作为参数传递。
关于c++ - 为什么 std atomic 将 5 插入堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663701/