c++ - 为什么 std atomic 将 5 插入堆栈

标签 c++ assembly g++

我想看看 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_cstfetch_add 的默认值的排序参数,因此您希望看到它作为参数传递。

关于c++ - 为什么 std atomic 将 5 插入堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663701/

相关文章:

c - 调试相当于 C 代码的程序集以了解函数调用

c - 如何在运行时在 Windows 上的 64 位应用程序中设置程序集中的函数参数?

c++ - g++ -Wall 没有关于 double-> int cast 的警告

c++ - Redhat Linux - 找不到 SO 文件

c++ - g++ 是否将 C 标准库的名称声明为 extern "C"linkage 或 extern "C++"?

c++ - 如果有虚方法,是否要创建vtable?

c++ - valgrind 检测到的库中的内存泄漏和错误

c# - 从 .NET 确定 C# 和 C++ 的 SLOC 和复杂性

performance - 保存左移(SHL)中偏移的位

c++ - 重叠 QGraphicsPixmapItem 的