公司动态

从 GCC 13 反汇编看内存一致性:为什么普通的 MOV 在 ARM 上必须变成 LDAR/STLR?

📅 2026/7/21 21:16:32
从 GCC 13 反汇编看内存一致性:为什么普通的 MOV 在 ARM 上必须变成 LDAR/STLR?
大量 GitHub 上的无锁队列实现依赖 x86-TSO 的强内存模型“碰巧正确”,迁移到 ARM(包括 Apple Silicon、AWS Graviton)后立刻暴露缺失的 acquire/release 屏障,表现为间歇性读到脏数据。本文从一段 GCC 13 在 x86-64 与 AArch64 上的对照反汇编出发,拆清 memory_order_relaxed/acquire/release/seq_cst 在收发线程模型中的正确映射,走读 Folly 和 rigtorp 的真实代码看 cache line padding 如何消灭 false sharing,剖析网络 buffer 复用场景下 ABA 与 epoch-based reclamation 的生命周期陷阱,论证为什么“一个 IO 线程喂多个 worker”应该用 MPSC 而非 MPMC,并给出一个可移植 SPSC ring 的完整实现。一段反汇编揭开的真相看两段一模一样的 C++ 代码,GCC 13 -O2 分别为 x86-64 和 AArch64 生成了什么(可在 Compiler Explorer 复验):// C++20, GCC 13, -O2#include