Es fácil ver que:Operaciones lógicas en operaciones de módulo múltiple optimizadas?
(i % 3 == 0) && (i % 5 == 0)
se puede simplificar a:
(i % 15 == 0)
mirando Sin embargo, en la salida del CCG, al parecer esto no se hace incluso a altos niveles de optimización.
¿Los compiladores realizan este tipo de optimizaciones, o hay una buena razón por la cual esas dos pruebas no son semánticamente equivalentes?
Editar: En respuesta a los que dicen que este es un caso marginal, el siguiente es un caso similar:
(i < 3) && (i < 5)
Cualquier número menor que 3, debe ser siempre inferior a 5. Segunda prueba es redundante.
También me gustaría añadir lo siguiente en respuesta a la respuesta que el compilador no puede saber si está afectado el medio ambiente ... Mira este código:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
función entera se reduce a "REPZ ret "por GCC con -O2
. Eso es mucho más complejo que cualquier cosa de la que estoy hablando.
Supongo que es para garantizar la evaluación de cortocircuitos ... – Anycorn
¿Los compiladores en general comprueban si hay múltiples comparaciones en la misma variable para la optimización? Parece un caso marginal ... – trutheality
@Anycorn, ¿Estás diciendo que evaluar 'i' puede tener efectos secundarios, y el compilador no sabe si lo hace o no? – ikegami