__attribute__((const)) 与 GNU C 中的 __attribute__((pure))

__attribute__((const)) vs __attribute__((pure)) in GNU C

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

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

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

来自documentation for the ARM compiler(基于gcc):

__attribute__((pure)) function attribute
Many functions have no effects except to return a value, and their return value depends only on the parameters and global variables. Functions of this kind can be subject to data flow analysis and might be eliminated.

__attribute__((const)) function attribute
Many functions examine only the arguments passed to them, and have no effects except for the return value. This is a much stricter class than __attribute__((pure)), because a function is not permitted to read global memory. If a function is known to operate only on its arguments then it can be subject to common sub-expression elimination and loop optimizations.

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

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

The pure attribute prohibits a function from modifying the state of the program that is observable by means other than inspecting the function’s return value. However, functions declared with the pure attribute can safely read any non-volatile objects, and modify the value of objects in a way that does not affect their return value or the observable state of the program.

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

__attribute__ ((const))表示return值只是参数的函数,如果任何参数是指针,那么指针不得取消引用.

一个const函数总是pure

const 函数的示例是 <stdlib.h> 中的 abs 函数和 <math.h> 中的一些数学函数:sqrtexp等(尽管它们可能会受到舍入模式的影响)。

pure 的示例,但非常量函数将是 strlen 这样的函数 - 因为它取消引用传入的指针。

请注意,如果向函数传递一个指针并检查该指针的上下文,则不能声明它 const,即使传递的指针和指针上下文是 const。这是对 const.

用途的严重限制

您可以 return 通过使用结构在 C 中使用多个值,这样更易​​于使用 pure。 (使用指针 return 操作数更为典型,但这会破坏 pure 的使用)。