C / C ++ tipo __restrict
-
02-10-2019 - |
Domanda
C'è un modo per definire usando typedef tipo integrale / galleggiante che non implica alcuna aliasng?
qualcosa di equivalente a (ma costrutto primitiva):
template < typename T >
struct restrict { T* __restrict data; };
come domanda relativa, è possibile chiedere gcc quello che determina alias / no alias di puntatore è?
Soluzione
Come notato nei commenti, molti compilatori C ++ più recente fanno sostenere l'attuazione del C99 limitare qualificatore tipo. Dal momento che restrict
non è una parola chiave riservata in C ++, i compilatori generalmente usano __restrict
o __restrict__
. Entrambi GCC e Visual C ++ documentare questo bene, con riferimenti espliciti a C99
Il 1998 norma stabilisce che "L'identificatore typedef
non deve ... essere combinati in un decl-specifier-ss C ++ con qualsiasi tipo di identificatore, tranne un tipo-specifier ". Essenzialmente, deve essere un elenco di tipo-specificatori , che comprende i due CV-qualificazioni , const
e volatile
.
C99 definisce typedef in modo simile, se non che la sua lista di qualificazioni comprende restrict
.
Si può ragionevolmente prevedere un supporto simile a typedef per la __restrict
non standard ... ma non si sa mai!
Un intelligente e modo semplice per verificare 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 simbolo link_fail
irrisolto si trova nel file oggetto, il linker genera un errore. Se il compilatore è limitare adeguatamente i due argomenti, allora dovrebbe conoscere il valore di a
, anche dopo b
è cambiato. Quindi, dovrebbe spogliare l'intero se isolato dal file oggetto generato dal momento che non verrà mai eseguito.
Si noti che, anche se GCC ha sostenuto la sintassi limitare in quanto almeno la versione 3.0, ma davvero non eseguire le ottimizzazioni corrette fino versione 4.5 .