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

C语言pure、const、unsequenced、reproducible属性差异解析

关于C23 [[unsequenced]]/[[reproducible]]与GCC pure/const属性的理解验证

C23标准新增了[[unsequenced]]和[[reproducible]]两个函数属性,目前GCC已支持这两个属性,同时保留了原有的pure、const属性。我对这四个属性的具体差异存在疑惑,现有资料大多仅对比其中一两个属性,未同时覆盖全部四个。请问我对它们的如下理解是否正确?

属性副作用输出方式读取全局变量[0]写入全局变量[0]读取指针参数写入指针参数示例优化方式
pure无副作用仅通过返回值输出允许读取非易失性全局变量[1]禁止允许读取指向内容禁止写入指向内容strlen、memcpy全局变量与参数未变化时,可省略重复调用
const无副作用仅通过返回值输出仅允许读取不会改变返回值的常量[2]禁止仅允许读取常量指针指向内容[2]禁止写入指向内容abs相同参数调用返回值一致,可编译期求值
[[unsequenced]]允许有副作用仅通过返回值输出仅允许读取不会改变返回值的常量禁止允许读取指向内容禁止写入指向内容strlen函数调用顺序可被编译器重排
[[reproducible]]允许有副作用可通过返回值或修改指针参数输出仅允许读取不会改变返回值的常量禁止允许读取指向内容允许写入指向内容memcpy相同参数的重复调用可被省略
无属性允许有副作用可通过返回值/参数/全局变量输出允许读取允许允许读取指向内容允许写入指向内容printf无特殊优化

脚注

[0]:此处“全局变量”包含static和thread_local类型的变量。

[1]:GCC官方文档说明:

被pure属性声明的函数可以安全地读取任何非易失性对象。

[2]:GCC官方文档说明:

被const属性声明的函数可以安全地读取不会改变其返回值的对象,比如非易失性常量。
注意:如果指针指向的数据可能在函数的连续调用之间发生变化,那么带有指针参数并检查指向数据的函数不得被声明为const。
一般来说,由于函数无法区分可能变化和不会变化的数据,const函数永远不应该接受指针(或C++中的引用)参数。

参考资料

  • C23的[[reproducible]]和[[unsequenced]]属性的使用场景说明
  • C++11 constexpr与C23 [[reproducible]]的差异对比
  • GNU C中__attribute__((const))与__attribute__((pure))的区别
  • GCC官方函数属性文档

内容的提问来源于Stack Exchange,提问作者Anon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:15:03