c++ - 为什么std atomic将5插入堆栈
问题描述
我想看看如何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 非常有帮助地发布在评论中,并将 GCC 命令行更改为 use -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
's ordering 参数的默认值,因此您希望看到它作为参数传递。
推荐阅读
- vb.net - 如何删除并重新添加字符串中的逗号?
- python - 如何向 pandas.plotting.parallel_coordinates 添加颜色条?
- git - 在 GitLab 中设置 PuTTY 创建的 SSH 密钥
- scala - 使用 GraphFrames (Scala) 计算层次结构
- twilio - 如何使用 Twilio Studio 用音乐转接电话
- python - VScode 上 db.execute('') 中的自动完成 SQL 查询
- tinymce - TinyMCE5 工具栏可以在维护工具栏插件的同时隐藏吗?
- swift - 是否可以在 RealityKit 中为对象提供基于位置的锚点?
- php - php 高级按数字排序,其次是 aphabet
- r - GCalignR 的 R 预处理数据中的字符串拆分问题