2010-05-09 10 views
28

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?

+1

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

+0

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

+0

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

Respuesta

26

En general, parece que casi todos los compiladores admiten los atributos de GCC. MSVC es hasta ahora el único compilador que no los admite (y que tampoco tiene ninguna alternativa).

+1

MSVC tampoco tiene intención de agregar soporte para esos atributos: https://connect.microsoft.com/VisualStudio/feedback/details/804288/msvc-add-const-and-pure-like-function-attributes. Dicen que no lo necesitan, lo que tiene sentido para las aplicaciones, pero no para las bibliotecas. – bcmpinc

+2

Piense en GNU C como un dialecto de idioma o conjunto de extensiones de idioma. Puede probar la disponibilidad de una característica C de GNU específica en cualquier compilador usando '#if __GNUC__> 4 || ... 'o similar, como se recomienda [en el manual] (https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html). Clang (y otros compiladores) solo anuncian una versión '__GNUC__' y' __GNUC_MINOR__' que son totalmente compatibles. La implementación puede ser diferente de la de gcc (p.'__builtin_constant_p() 'de clang no propaga const-ness en args de funciones inlined), pero su código se compilará. –

+1

En otras palabras, clang e ICC podrían admitir una nueva característica de gcc 6.0, pero solo definirá '__GNUC__' a 6 y' __GNUC_MINOR__' a 0 en versiones que admitan * todas * las extensiones de idioma que hace gcc6.0. –

Cuestiones relacionadas