2015-03-18 16 views

risposta

22

Dal documentation for the ARM compiler (che si basa su GCC):

__attribute__((pure)) attributi funzione
Molte funzioni non hanno effetto se non per restituire un valore, e la loro il valore di ritorno dipende solo dai parametri e dalle variabili globali. Funzioni di questo tipo possono essere soggette all'analisi del flusso di dati e potrebbero essere eliminate.

__attribute__((const)) attributo funzione
Molte funzioni esaminare solo gli argomenti passati a loro, e non hanno effetti, tranne per il valore di ritorno. Questa è una classe molto più rigida di __attribute__((pure)), perché non è consentita la lettura della memoria globale. Se una funzione è nota per operare solo sui suoi argomenti, può essere soggetta all'eliminazione di sub-espressione e alle ottimizzazioni del ciclo.

Così, TL; DR: __attribute__((const)) è lo stesso di __attribute__((pure)) ma senza alcun accesso a variabili globali.

+2

Si noti che il compilatore ARM fornisce anche un qualificatore della funzione '__pure', che è più rigido dell'attributo' pure', ed è equivalente all'attributo 'const'. – ysap

+7

Da notare anche la nota sugli argomenti del puntatore nel documento GCC: 'Si noti che una funzione che ha argomenti puntatore ed esamina i dati puntati a non deve essere dichiarata const ' – origo

2

La differenza è spiegata nel GCC manuals

Il __attribute__ ((pure)) significa che la funzione non ha effetti collaterali e il valore restituito dipende dalle argomentazioni e lo stato delle variabili globali. Pertanto è sicuro che l'ottimizzatore elide alcune chiamate ad esso, se gli argomenti sono gli stessi e lo stato dei globali non cambia tra le chiamate.

Il __attribute__ ((const)) significa che il valore di ritorno è unicamente una funzione degli argomenti, e se uno qualsiasi degli argomenti sono puntatori, quindi i puntatori non devono essere dereferenziati.

Una funzione const è sempre pure.

Esempi di const funzioni sarebbero le funzioni matematiche da <math.h>: sqrt, exp, ecc (anche se potrebbe essere soggetto a modalità di arrotondamento).

Esempi di pure ma non const funzioni sarebbero tali funzioni strlen - come dereferenzia il puntatore passato in