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
函数和来自
一些数学函数: sqrt
, exp
等(尽管它们可能受到舍入模式的影响)。
pure
但非const函数的例子是strlen
这样的函数 – 因为它取消引用传入的指针。