为何同时存在__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更简洁,省去了取址的步骤。
- 当你需要把一个已存在的变量内容原子性写入目标地址时,
为何同时提供这两个函数?
场景覆盖更全面
两个接口分别覆盖了"从内存地址读源值"和"直接传值"的原子存储需求,开发者无需为了适配单一接口做额外的代码冗余(比如为了用__atomic_store_n而临时定义变量,或者为了用__atomic_store而给常量取址)。编译优化空间不同
在部分CPU架构下,__atomic_store_n可以直接把常量加载到寄存器执行原子操作,生成的机器码更紧凑;而__atomic_store则需要先从内存读取源值,再执行原子写入。编译器会针对不同接口做针对性优化,让开发者可以根据性能需求选择。历史与兼容考量
早期GCC原子操作接口以指针传递的__atomic_store为基础,后来为了简化直接传值的常用场景,补充了__atomic_store_n,同时保留原有接口以兼容旧代码。
内容的提问来源于stack exchange,提问作者Galux Trabakoulas
相关产品推荐
相关产品推荐

