2010-05-31 8 views
6

He leído el ensayo Surviving the Release Version.Alias ​​variable de C++: ¿qué es eso exactamente y por qué es mejor desactivarlo?

Bajo la cláusula "Aliasing errores" que dice:

Puede obtener el código más estricto si le dice el compilador que no puede asumir ninguna aliasing ....

I' También leí Aliasing (computing).

¿Qué es exactamente un alias variable? Entiendo que significa que usar un puntero a una variable es un alias, pero, ¿cómo/por qué afecta gravemente, o en otras palabras? ¿Por qué decirle al compilador que puede suponer que no hay aliasing me daría un "código más ajustado"

Respuesta

5

No permitir alias significa que si tiene un puntero char* b, puede suponer que b es el único puntero en el programa que apunta a esa ubicación de memoria particular, lo que significa que el único momento en que la ubicación de memoria cambiará es cuando el programador usa b cambialo. Por lo tanto, el conjunto generado no necesita volver a cargar la memoria apuntada por b en un registro, siempre que el compilador sepa que nada ha usado b para modificarlo. Si se permite el aliasing, es posible que haya otro puntero char* c = b; que se usó en otro lugar para meterse con esa memoria

+0

"El conjunto generado no necesita volver a cargar la memoria apuntada por b ...". Eso es todo lo que necesitaba, gracias. En realidad, después de leer tu respuesta, solo entonces entendí realmente la respuesta de Samuel, ya que los tuyos completaron el acertijo. ¡Gracias a los dos! – Poni

12

El alias es cuando tiene dos referencias diferentes a la misma memoria subyacente. Considere esta formada por ejemplo:

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 
} 

Si el compilador tiene que permitir traslape, se debe considerar la posibilidad de que n1 == n2. Por lo tanto, cuando necesite usar el valor de *n1 en "línea de interés", debe tener en cuenta la posibilidad de que haya sido cambiado por la línea *n2 = 0.

Si el compilador no puede asumir ningún aliasing, puede suponer en "línea de interés" que *n1 == 1 (porque de lo contrario no estaríamos dentro del if). El optimizador puede usar esta información para optimizar el código (en este caso, cambie la "línea de interés" de seguir el puntero y realice una adición de propósito general para usar un incremento simple).