Si llamo a una función que tiene un parámetro volátil, y ese parámetro no se utiliza, ¿debe el compilador, no obstante, producir el parámetro?¿Se debe respetar un parámetro volátil no utilizado?
void consume(volatile int) { }
...
consume(some_expr);
GCC hace honor a esto, pero no estoy seguro si la redacción de volátil en los estándares lo requiere. En mi opinión GCC está haciendo lo correcto - esto es lógicamente una asignación a una variable volátil y por lo tanto no debe ser omitido (según 1,9-8 del C++ estándar)
NOTA: El propósito de esto es para evitar que el optimizador elimine la evaluación del código. Es decir, fuerza some_expr
para ser evaluado. Permite que la expresión se optimice, pero asegura que realmente se realice.
He añadido C y C++ como etiquetas, ya que la respuesta a ambas me interesa si hubiera alguna diferencia. No creo que haya sin embargo.
RESPUESTA: Escogí la primera porque creo que es la realización práctica correcta de la norma. Sin embargo, el punto de vista filosófico de Steve es muy interesante y, de hecho, puede significar que el estándar es ambiguo.
Sí, entiendo 'some_expr', esa es mi intención. El compilador aún puede optimizar eso como quiera, pero el _valor real_ de ese cálculo (según lo dictado por la máquina abstracta) debe obtenerse de alguna manera para asignarlo a la variable. –
Es cierto, pero eso podría estar disponible a través de Eliminación de Subexpresión Común, por ejemplo. Mi punto es que si el compilador sabe mágicamente 'some_expr == 5', la inicialización del argumento sin nombre con 5 sigue siendo observable. – MSalters
Sí, creo que estamos de acuerdo en eso. Lo admito, suena realmente extraño ya que el uso no es inmediatamente evidente, pero me ayuda mucho en las pruebas de rendimiento. –