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 è?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top