为什么 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 行(推到堆栈上?
如果您将 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
,我们可以查看文档并查看
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++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- C++ 堆栈中的类对象作为 Map 的值插入
- 使用链表在堆栈中插入和删除
- 为什么 std 原子将 5 插入堆栈
- 需要将堆栈插入列表
- 如何循环两次,将不同的值插入两个不同的堆栈
- 二进制搜索树递归插入导致堆栈溢出,迭代插入不起作用
- 二进制树插入方法导致堆栈溢出
- 如何在 C++ 中使用指针插入堆栈