2009-04-16 9 views

Respuesta

17

Hay una página que describe alias muy a fondo here.

También hay algunos temas SO here y here.

En resumen, el compilador no puede asumir el valor de los datos cuando dos punteros de tipos diferentes acceden a la misma ubicación (es decir, debe leer el valor cada vez y, por lo tanto, no puede realizar optimizaciones).

Esto solo ocurre cuando no se aplica el alias estricto. Opciones de alias estrictas:

  • gcc: -fstrict-aliasing [por defecto] y -fno-estricta-aliasing
  • msvc: aliasing estricto está desactivada por defecto. (Si alguien sabe cómo encenderlo, favor dilo.)

Ejemplo

Copiar y pegar este código en main.c:

void f(unsigned u) 
{ 
    unsigned short* const bad = (unsigned short*)&u; 
} 

int main(void) 
{ 
    f(5); 

    return 0; 
} 

Entonces compile el código con estas opciones:

main.c gcc -Wall -O2

y obtendrá:

main.c: 3: advertencia: eliminación de referencias de tipo hizo juegos de palabras puntero se romperá estricta-aliasing reglas

aliasing Desactivar con:

gcc mAIN.C -fno-estrictas-alias ing -Wall -O2

Y la advertencia desaparece. (O simplemente elimine -Wall pero ... no lo compile sin él)

Intente como podría No pude obtener MSVC para darme una advertencia.

+0

+1, pero deje en claro que el compilador no puede hacer esa suposición cuando el alias * estricto * no * se observa. –

+1

¡Perfecto! :) Desafortunadamente, MSVC++ no parece tener una opción para el alias estricto. Sin embargo, tiene __restrict y __declspec (restrict), que se pueden usar en casos individuales. –

+0

Parece un error tipográfico "-fno-strict-aliasing [predeterminado] y -fno-strict-aliasing" Supongo que el valor predeterminado es en realidad -fstrict-aliasing (al menos en GCC moderno) en lugar de -fno-strict- aliasing, pero en cualquier caso una de las dos opciones de GCC enumeradas debería ser -fstrict-aliasing, y ahora ambos dicen -fno-strict-aliasing. – tialaramex

Cuestiones relacionadas