2010-05-31 7 views
6

Ho letto il saggio Surviving the Release Version.Alias ​​variabile C++: cos'è esattamente, e perché è meglio disattivarlo?

Sotto la clausola "Aliasing bug", si legge:

È possibile ottenere il codice più stretto se dite al compilatore che può assumere alcuna aliasing ....

I' anche leggere Aliasing (computing).

Che cosa è esattamente un alias variabile? Capisco che usare un puntatore a una variabile sia un alias, ma, come/perché ha un impatto negativo, o in altre parole - perché dire al compilatore che non può assumere alcun alias mi porterebbe un "codice più stretto"

risposta

5

Disabilitare l'aliasing significa che se si ha un puntatore char* b, si può presumere che b sia l'unico puntatore nel programma che punta a quella particolare posizione di memoria, il che significa che l'unica volta che la posizione della memoria cambierà è quando il programmatore usa b cambiarlo. L'assembly generato, quindi, non ha bisogno di ricaricare la memoria indicata da b in un registro finché il compilatore non sa nulla ha usato b per modificarlo. Se è consentito l'aliasing, è possibile che sia presente un altro puntatore char* c = b; utilizzato altrove per risolvere il problema.

+0

"L'assieme generato non ha quindi bisogno di ricaricare la memoria indicata da b ...". Questo è tutto ciò di cui avevo bisogno, grazie. In realtà, dopo aver letto la tua risposta, solo allora ho davvero capito la risposta di Samuel, come il tuo come completato il puzzle. Grazie a tutti e due !! – Poni

12

L'aliasing è quando si hanno due diversi riferimenti alla stessa memoria sottostante. Si consideri l'esempio costituito da:

int doit(int *n1, int *n2) 
{ 
    int x = 0; 

    if (*n1 == 1) 
    { 
     *n2 = 0; 

     x += *n1 // line of interest 
    } 

    return x; 
} 

int main() 
{ 
    int x = 1; 

    doit(&x, &x); // aliasing happening 
} 

Se il compilatore deve consentire aliasing, ha bisogno di considerare la possibilità che n1 == n2. Pertanto, quando è necessario utilizzare il valore di *n1 in "linea di interesse", è necessario considerare la possibilità che sia stato modificato dalla riga *n2 = 0.

Se il compilatore non può assumere aliasing, può assumere "linea di interesse" che *n1 == 1 (perché altrimenti non saremmo all'interno dello if). L'ottimizzatore può quindi utilizzare queste informazioni per ottimizzare il codice (in questo caso, cambiare "linea di interesse" dal seguire il puntatore e fare un'aggiunta generica all'utilizzo di un semplice incremento).

Problemi correlati