GNU C中的__attribute __((const))vs __attribute __((pure))

wef*_*fa3 30 c attributes gcc gnu const

__attribute__((const))__attribute__((pure))GNU C有什么区别?

__attribute__((const)) int f() {
    /* ... */
    return 4;
}
Run Code Online (Sandbox Code Playgroud)

VS

__attribute__((pure)) int f() {
    /* ... */
    return 4;
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 32

ARM编译器文档(基于gcc):

__attribute__((pure))function属性
除了返回值之外,许多函数都没有效果,它们的返回值仅取决于参数和全局变量.这种功能可以进行数据流分析,可以消除.

__attribute__((const))function属性
许多函数只检查传递给它们的参数,除了返回值之外没有任何效果.这是一个比它更严格的类__attribute__((pure)),因为不允许函数读取全局内存.如果已知函数仅对其参数进行操作,则可以对常见的子表达式消除和循环优化进行处理.

因此,TL; DR:与全局变量__attribute__((const))无关,__attribute__((pure))但没有任何访问权限.

  • 另外值得注意的是关于GCC doc中指针参数的注释:`注意,具有指针参数并检查指向的数据的函数不得声明为const. (9认同)
  • 请注意,ARM编译器还提供了一个`__pure`函数限定符,它比`pure`属性更严格,相当于`const`属性. (3认同)

Ant*_*ala 17

GCC手册中解释了这种差异.最值得注意的是,const函数可能只使用传入的参数而不是任何内存,而pure函数也可以在约束条件下访问内存:

pure属性禁止函数通过检查函数返回值以外的方式修改可观察的程序状态.但是,使用pure属性声明的函数可以安全地读取任何非易失性对象,并以不影响其返回值或程序的可观察状态的方式修改对象的值.

__attribute__ ((pure))意味着该函数没有副作用,返回的值取决于参数和全局变量的状态.因此,如果参数相同,优化器可以安全地忽略对它的一些调用,并且调用者没有做任何事情来改变调用之间的全局变量的状态.

__attribute__ ((const))意味着返回值只是参数的函数,如果任何参数是指针,那么指针不能被解引用.

一个const功能始终pure.

实例const的功能将是abs从功能<stdlib.h>和一些数学函数从<math.h>:sqrt,exp,等(虽然他们可能受到舍入模式).

pure但是非const函数的例子是这样的函数strlen- 因为它取消引用传入的指针.