__tribuir __ ((const)) vs __tribuir __ ((puro)) en GNU C

¿Cuál es la diferencia entre __attribute__((const)) y __attribute__((pure)) en GNU C?

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

vs

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

De la documentación para el comstackdor ARM (que se basa en gcc):

atributo de función __attribute__((pure))
Muchas funciones no tienen ningún efecto excepto para devolver un valor, y su valor de retorno depende solo de los parámetros y las variables globales. Las funciones de este tipo pueden estar sujetas a análisis de flujo de datos y pueden ser eliminadas.

atributo de función __attribute__((const))
Muchas funciones solo examinan los argumentos que se les pasan y no tienen ningún efecto excepto el valor de retorno. Esta es una clase mucho más estricta que __attribute__((pure)) , porque una función no tiene permiso para leer la memoria global. Si se sabe que una función opera solo sobre sus argumentos, puede estar sujeta a eliminaciones de sub-expresiones comunes y optimizaciones de bucle.

Entonces, TL; DR: __attribute__((const)) es lo mismo que __attribute__((pure)) pero sin acceso a variables globales.

La diferencia se explica en los manuales de GCC

El __attribute__ ((pure)) significa que la función no tiene efectos secundarios y el valor devuelto depende de los argumentos y el estado de las variables globales. Por lo tanto, es seguro para el optimizador eludir algunas llamadas a él, si los argumentos son los mismos, y el estado de los globales no cambió entre llamadas.

El __attribute__ ((const)) significa que el valor de retorno es únicamente una función de los argumentos, y si alguno de los argumentos son punteros, no se debe desreferenciar los punteros .

Una función const es siempre pure .

Ejemplos de funciones const serían las funciones matemáticas de : sqrt , exp , etc. (Aunque podrían estar sujetas a modos de redondeo).

Ejemplos de funciones pure pero no constantes serían funciones tales como strlen , ya que desreferencia el puntero pasado.