Una función se llama función pura si siempre devuelve el mismo resultado para los mismos valores de argumento y no tiene efectos secundarios como modificar un argumento (o variable global) o generar algo. El único resultado de llamar a una función pura es el valor de retorno. Ejemplos de funciones puras son strlen(), pow(), sqrt(), etc. Ejemplos de funciones impuras son printf(), rand(), time(), etc.
Si una función se conoce como pura para el compilador, se le puede aplicar la optimización de bucles y la eliminación de subexpresiones . En GCC, podemos marcar funciones como puras usando el atributo «puro».
__attribute__ ((pure)) return-type fun-name(arguments1, …) { /* function body */ }
El siguiente es un ejemplo de función pura que devuelve el cuadrado de un entero pasado.
__attribute__ _((pure)) int my_square(int val) { return val*val; }
Considere el siguiente ejemplo
for (len = 0; len < strlen(str); ++len) printf("%c", toupper(str[len]));
Si la función «strlen()» no está marcada como función pura, el compilador invocará la función «strlen()» con cada iteración del ciclo, y si la función está marcada como función pura, el compilador conoce el valor de «strlen()». la función será la misma para cada llamada, es por eso que el compilador optimiza el ciclo for y genera un código como el siguiente.
int len = strlen(str); for (i = 0; i < len; ++i) printf("%c", toupper((str[i]));
Escribamos nuestra propia función pura para calcular la longitud de la string.
__attribute__ ((pure)) size_t my_strlen(const char *str) { const char *ptr = str; while (*ptr) ++ptr; return (ptr – str); }
Marcar la función como pura indica que es seguro llamar a la función hipotética “my_strlen()” menos veces de las que dice el programa.
Este artículo fue compilado por «Narendra Kangralkar» y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA