puro è un attributo di funzione che indica che una funzione non modifica alcuna memoria globale.
const è un attributo di funzione che indica che una funzione non legge/modifica alcuna memoria globale.attributi di funzione pure/const in diversi compilatori
Data questa informazione, il compilatore può fare alcune ottimizzazioni aggiuntive.
Esempio per 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)); }
In questo esempio, il compilatore potrebbe ottimizzare la funzione calcolare 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;
}
Oppure, se il compilatore è abbastanza intelligente (e non così severo su galleggianti):
float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }
Come posso contrassegnare af unzione in tal modo per i diversi compilatori, ad esempio GCC, Clang, ICC, MSVC o altri?
Per quelli di noi che non utilizzano gcc su base regolare, forse è possibile pubblicare una spiegazione di ciò che è l'attributo pure/const. Se si tratta di un'ottimizzazione di qualche tipo, sarebbe utile anche un esempio di codice C o C++ per il quale aiuta il compilatore a generare un assemblaggio più ottimale. –
Non sono uno scrittore di compilatori, ma mi sembra che tale attributo non sarebbe necessario se la definizione della funzione 'sigmoid()' fosse disponibile per il compilatore * prima di * parsing 'calculate()' nella stessa unità di traduzione. Indipendentemente da ciò, questi attributi potrebbero certamente essere utili quando le definizioni delle funzioni sono in unità di traduzione diverse. – Void
Sì, GCC (e altri compilatori) aggiungono automaticamente questo attributo internamente esattamente in quel caso. E poi, in base all'attributo, possono fare ulteriori ottimizzazioni (come nel mio esempio). E si colpisce esattamente uno dei motivi principali per specificarlo esplicitamente: Se il compilatore non vede la definizione in quel punto o se la definizione non è affatto disponibile o se si pensa che sia sicuro se il compilatore riduce la quantità di chiama alla funzione. – Albert