[英]Why does compare_exchange_strong fail with std::atomic<double>, std::atomic<float> in C++?
[英]Why does std atomic insert 5 to the stack
我想看看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鏈接Richard Critten非常有幫助地在評論中發布,並將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
,我們可以查看文檔並查看
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
的排序參數的默認值,因此您希望將其視為參數傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.