pure es un atributo de función que indica que una función no modifica ninguna memoria global.
const es un atributo de función que dice que una función no lee/modifica ninguna memoria global.atributos de función pure/const en compiladores diferentes
Teniendo en cuenta esa información, el compilador puede realizar algunas optimizaciones adicionales.
Ejemplo para GCC:
float sigmoid(float x) __attribute__ ((const));
float calculate(float x, unsigned int C) {
float sum = 0;
for(unsigned int i = 0; i < C; ++i)
sum += sigmoid(x);
return sum;
}
float sigmoid(float x) { return 1.0f/(1.0f - exp(-x)); }
En ese ejemplo, el compilador podría optimizar la función calcular a:
float calculate(float x, unsigned int C) {
float sum = 0;
float temp = C ? sigmoid(x) : 0.0f;
for(unsigned int i = 0; i < C; ++i)
sum += temp;
return sum;
}
O si su compilador es suficientemente inteligente (y no tan estrictos acerca flotadores):
float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }
¿Cómo puedo marcar una unction de tal manera para los diferentes compiladores, es decir, GCC, Clang, ICC, MSVC u otros?
Para aquellos de nosotros que no usamos gcc de forma regular, quizás pueda publicar una explicación de qué es el atributo pure/const. Si se trata de una optimización de algún tipo, un ejemplo de código C o C++ para el cual ayuda al compilador a generar un ensamblaje más óptimo también sería útil. –
No soy un escritor de compiladores, pero me parece que dicho atributo sería innecesario si la definición de la función 'sigmoid()' estuviera disponible para el compilador * antes * de analizar 'calculate()' en la misma unidad de traducción. De todos modos, estos atributos ciertamente podrían ser útiles cuando las definiciones de función están en diferentes unidades de traducción. – Void
Sí, GCC (y otros compiladores) agregan automáticamente este atributo internamente exactamente en ese caso. Y luego, en función del atributo, pueden realizar más optimizaciones (como en mi ejemplo). Y acerta exactamente uno de los principales motivos para especificarlo explícitamente: si el compilador no ve la definición en ese punto o si la definición no está disponible o si cree que es seguro si el compilador reduce la cantidad de llama a la función. – Albert