Tuve un argumento hoy con uno de mis colegas sobre el hecho de que un compilador podría cambiar la semántica de un programa cuando se habilitan optimizaciones agresivas.Puntos de secuencia, condicionales y optimizaciones
Mi colega afirma que cuando las optimizaciones están habilitadas, un compilador puede cambiar el orden de algunas instrucciones. De modo que:
function foo(int a, int b)
{
if (a > 5)
{
if (b < 6)
{
// Do something
}
}
}
podría ser cambiado a:
function foo(int a, int b)
{
if (b < 6)
{
if (a > 5)
{
// Do something
}
}
}
Por supuesto, en este caso, no cambia el programa de comportamiento general y no es realmente importante.
Desde mi entender, creo que los dos pertenecen a dos if (condition)
secuencia diferente señala y que el compilador no puede cambiar su orden, incluso si el cambio se mantendría el mismo comportamiento general.
Entonces, queridos usuarios de SO, ¿cuál es la verdad con respecto a esto?
No sé la semántica real sobre los puntos de secuencia, pero solo imagine que ambos casos son equivalentes a 'if (a> 5 && b <6)' ... y que esos son a su vez conmutativos.La única diferencia de rendimiento proviene de lo que es estadísticamente más probable que cause un cortocircuito. Pero la pregunta es, incluso con ese cambio, ¿hay dos puntos de secuencia en cada lado del '&&'? Me imagino que tiene que haber, ya que esa es la única forma en que se pueden implementar los cortocircuitos. –
[Esta respuesta a las preguntas frecuentes] (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4176333#4176333) enumera todos los puntos de secuencia. ¿Lo has visto? – sbi
@sbi: No, yo no. Pero lo haré ahora;) Gracias. – ereOn