You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何同时存在__atomic_store与__atomic_store_n?二者差异解析

GCC原子内置函数:__atomic_store 与 __atomic_store_n 的差异及存在意义

核心差异

  • 参数传递方式不同

    • __atomic_store 以指针形式传递源值和目标地址:第一个参数是要写入的目标指针,第二个参数是存储源值的变量指针,最后是内存顺序参数。示例代码:
      int src = 0x1234;
      int dest;
      __atomic_store(&dest, &src, __ATOMIC_RELEASE);
      
    • __atomic_store_n 直接传递源值字面量/变量值:前两个参数分别是目标指针和具体的数值/变量值,第三个是内存顺序。示例代码:
      int dest;
      __atomic_store_n(&dest, 0x1234, __ATOMIC_RELEASE);
      
  • 适用场景不同

    • 当你需要把一个已存在的变量内容原子性写入目标地址时,__atomic_store 更合适——比如从共享缓冲区读取值后原子写入目标,或者批量原子复制操作。
    • 当你要写入的是常量、临时计算结果,或者不想额外定义源变量时,__atomic_store_n 更简洁,省去了取址的步骤。

为何同时提供这两个函数?

  1. 场景覆盖更全面
    两个接口分别覆盖了"从内存地址读源值"和"直接传值"的原子存储需求,开发者无需为了适配单一接口做额外的代码冗余(比如为了用__atomic_store_n而临时定义变量,或者为了用__atomic_store而给常量取址)。

  2. 编译优化空间不同
    在部分CPU架构下,__atomic_store_n 可以直接把常量加载到寄存器执行原子操作,生成的机器码更紧凑;而__atomic_store 则需要先从内存读取源值,再执行原子写入。编译器会针对不同接口做针对性优化,让开发者可以根据性能需求选择。

  3. 历史与兼容考量
    早期GCC原子操作接口以指针传递的__atomic_store 为基础,后来为了简化直接传值的常用场景,补充了__atomic_store_n,同时保留原有接口以兼容旧代码。

内容的提问来源于stack exchange,提问作者Galux Trabakoulas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:36:21