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

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

 __attribute__((const)) int f() { /* ... */ return 4; } 

VS

 __attribute__((pure)) int f() { /* ... */ return 4; } 

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

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

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

因此,TL; DR: __attribute__((const))__attribute__((pure))相同,但不能访问全局变量。

GCC手册中解释了这种差异

__attribute__ ((pure))表示该函数没有副作用,返回的值取决于参数和全局变量的状态。 因此,如果参数相同,并且全局变量的状态在调用之间没有变化,优化器可以安全地忽略对它的一些调用。

__attribute__ ((const))表示返回值只是参数的函数, 如果任何参数是指针,则指针不得解除引用

const函数总是pure

const函数的例子是来自abs函数和来自一些数学函数: sqrtexp等(尽管它们可能受到舍入模式的影响)。

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