簡體   English   中英

為什么std原子會向堆棧插入5

[英]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_cstfetch_add的排序參數的默認值,因此您希望將其視為參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM