¿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.