una tipos superior qué pura orden matematicas función funciones funcion c pure-virtual

tipos - qué es una función pura



Beneficios de la función pura (6)

Además de los posibles beneficios en tiempo de ejecución, una función pura es mucho más fácil de razonar cuando se lee el código. Además, es mucho más fácil probar una función pura ya que sabes que el valor de retorno solo depende de los valores de los parámetros.

Hoy estaba leyendo acerca de la función pura, me confundí con su uso:

Se dice que una función es pura si devuelve el mismo conjunto de valores para el mismo conjunto de entradas y no tiene ningún efecto secundario observable.

por ejemplo, strlen() es una función pura mientras que rand() es impura.

__attribute__ ((pure)) int fun(int i) { return i*i; } int main() { int i=10; printf("%d",fun(i));//outputs 100 return 0; }

http://ideone.com/33XJU

El programa anterior se comporta de la misma manera que en ausencia de declaración pure .

¿Cuáles son los beneficios de declarar una función como pure [si no hay cambio en el resultado]?


Cuando dices que una función es "pura", estás garantizando que no tiene efectos secundarios externamente visibles (y como dice un comentario, si mientes, pueden suceder cosas malas). Saber que una función es ''pura'' tiene beneficios para el compilador, que puede usar este conocimiento para hacer ciertas optimizaciones.

Esto es lo que dice la documentación de GCC sobre el atributo pure :

puro

Muchas funciones no tienen ningún efecto excepto el valor de retorno y su valor de retorno depende solo de los parámetros y / o variables globales. Dicha función puede estar sujeta a eliminación de subexpresiones comunes y optimización de bucles tal como lo haría un operador aritmético. Estas funciones deben declararse con el atributo puro. Por ejemplo,

int square (int) __attribute__ ((pure));

La respuesta de Philip ya muestra cómo saber que una función es "pura" puede ayudar con las optimizaciones de bucle.

Aquí hay uno para eliminación de sub-expresión común (dado que foo es puro):

a = foo (99) * x + y; b = foo (99) * x + z;

Puede llegar a ser:

_tmp = foo (99) * x; a = _tmp + y; b = _tmp + z;


En general, las funciones Pure tienen 3 ventajas sobre las funciones impuras que el compilador puede aprovechar:

Almacenamiento en caché

Digamos que tienes una función pura f que se llama 100000 veces, dado que es determinista y depende solo de sus parámetros, el compilador puede calcular su valor una vez y usarlo cuando sea necesario

Paralelismo

Las funciones puras no leen ni escriben en ninguna memoria compartida y, por lo tanto, pueden ejecutarse en subprocesos separados sin ninguna consecuencia inesperada

Pasando por referencia

Una función f(struct t) obtiene su argumento t por valor, y por otro lado, el compilador puede pasar t por referencia a f si se declara puro mientras se garantiza que el valor de t no cambiará y tendrá mejoras de rendimiento

Además de las consideraciones de tiempo de compilación, las funciones puras pueden probarse bastante fácil: simplemente llámalas.

No es necesario construir objetos o simular conexiones a DBs / sistema de archivos.


Solo como un complemento, me gustaría mencionar que C ++ 11 codifica las cosas de alguna manera con la palabra clave constexpr. Ejemplo:

#include <iostream> #include <cstring> constexpr unsigned static_strlen(const char * str, unsigned offset = 0) { return (*str == ''/0'') ? offset : static_strlen(str + 1, offset + 1); } constexpr const char * str = "asdfjkl;"; constexpr unsigned len = static_strlen(str); //MUST be evaluated at compile time //so, for example, this: int arr[len]; is legal, as len is a constant. int main() { std::cout << len << std::endl << std::strlen(str) << std::endl; return 0; }

Las restricciones en el uso de constexpr hacen que la función sea demostrablemente pura. De esta forma, el compilador puede optimizar de forma más agresiva (¡solo asegúrese de utilizar recursividad de cola, por favor!) Y evaluar la función en tiempo de compilación en lugar de tiempo de ejecución.

Entonces, para responder a su pregunta, si usa C ++ (sé que dijo C, pero están relacionados), escribir una función pura en el estilo correcto permite al compilador hacer todo tipo de cosas interesantes con la función: -)


Una función no pura

int foo(int x, int y) // possible side-effects

es como una extensión de una función pura

int bar(int x, int y) // guaranteed no side-effects

en el que tiene, además de la función explícita argumentos x, y, el resto del universo (o cualquier cosa con la que su computadora se pueda comunicar) como una entrada de potencial implícita. Del mismo modo, además del valor de retorno entero explícito, cualquier cosa en la que su computadora pueda escribir es implícitamente parte del valor de retorno.

Debe quedar claro por qué es mucho más fácil razonar acerca de una función pura que una no pura.


pure permite al compilador saber que puede hacer ciertas optimizaciones sobre la función: imagine un poco de código como

for (int i = 0; i < 1000; i++) { printf("%d", fun(10)); }

Con una función pura, el compilador puede saber que necesita evaluar fun(10) una vez y una vez, en vez de 1000 veces. Para una función compleja, es una gran victoria.