2010-05-01 6 views
11

C'è un modo per definire l'uso di typedef integrale/float che non implica alcun aliasng?C/C++ tipo __restrict

qualcosa di equivalente a (ma costrutto primitiva):

template < typename T > 
struct restrict { T* __restrict data; }; 

questione correlata, è possibile chiedere gcc quello che determina alias/no alias di puntatore è?

+0

Immagino che compili se faccio 'typedef const double * __restrict type;' ma crea restrizione double * o qualche tipo di restrizione applicata a 'type'? – Anycorn

+0

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

+0

@P come posso farlo? guarda direttamente all'assemblaggio e vedi la differenza? restringere è in c99, pensavo che __restrict fosse C++? – Anycorn

risposta

19

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.

+0

"C99 definisce typedef in modo simile, tranne che la sua lista di qualificatori include restrizioni." Ho fatto [una domanda su questo] (http://stackoverflow.com/q/43631062/2542702) e tutti (che ha commentato finora) pensano che sia una cattiva idea. Puoi commentare? È legale C digitare typule un puntatore con restrizioni? –