Come notato nei commenti, molti nuovi compilatori C++ supportano l'implementazione C99 del qualificatore del tipo restrittivo. Poiché restrict
non è una parola chiave riservata in C++, i compilatori generalmente utilizzano __restrict
o __restrict__
. Entrambi lo GCC e lo Visual C++ lo descrivono bene, con riferimenti espliciti a C99.
I C++ 1998, norma stabilisce che "Il typedef
identificatore non deve ... essere combinati in un decl-specifier-ss con qualsiasi tipo di identificatore, tranne un tipo-specifier." Essenzialmente, deve essere un elenco di specifiers di tipo, che include le due qualifiche cv, const
e volatile
.
C99 definisce typedef in modo simile, tranne che l'elenco di qualificatori include restrict
.
Sembrerebbe ragionevole anticipare un supporto simile in typedef per il non standard __restrict
... ma non si sa mai!
un modo intelligente e facile da testare questa è la seguente:
extern void link_fail();
typedef int *__restrict restricted_int_p;
void test(restricted_int_p a, restricted_int_p b) {
*a = 1;
*b = 2;
if (*a == 2) link_fail();
}
Questa sfrutta semplicemente il fatto che se il link_fail
simbolo non risolto si trova nel file oggetto, il linker genera un errore. Se il compilatore sta restringendo correttamente i due argomenti, allora dovrebbe conoscere il valore di a
, anche dopo che b
è stato modificato. Pertanto, dovrebbe rimuovere l'intero blocco if dal file oggetto generato poiché non verrà mai eseguito.
Si noti che sebbene GCC supportasse la sintassi dei restringi almeno dalla versione 3.0, in realtà non ha eseguito le ottimizzazioni corrette fino a version 4.5.
fonte
2010-05-01 08:08:45
Immagino che compili se faccio 'typedef const double * __restrict type;' ma crea restrizione double * o qualche tipo di restrizione applicata a 'type'? – Anycorn
Prova e guarda. 'restrict' non è definito dallo standard C++ quindi ymmv. Se ricordo correttamente la mia esperienza personale, restrict partecipa a typedef in GCC. – Potatoswatter
@P come posso farlo? guarda direttamente all'assemblaggio e vedi la differenza? restringere è in c99, pensavo che __restrict fosse C++? – Anycorn