Como una expresión constante integral, el compilador tiene todo el derecho a usar plegado constante para eliminarlo del programa. Esto solo no es cierto si tomas su dirección. Además, un compilador optimizador moderno puede emplear LTO, alineación y plegado constante para hacer lo mismo con c3 y c4, si es posible.
Si no toma la dirección de una variable, el compilador no tiene obligación de asignarla si puede generar código con resultados equivalentes, bajo la regla de si.
Editar: plegamiento constante es donde el compilador evalúa las expresiones en tiempo de compilación en lugar de en tiempo de ejecución. Por ejemplo, puede hacer legalmente int x[3 + 4];
donde 3 + 4
se evalúa en tiempo de compilación. Algunos ejemplos, específicamente los que involucran ICE, tienen un mandato estándar, pero la implementación puede realizar más si es posible. LTO es Link Time Optimization, que es donde el compilador realiza optimizaciones en las unidades de traducción cuando están vinculadas entre sí.
Esto significa que el compilador puede inline el cuerpo de my_f
, y luego (en función del cuerpo) constante doblarla fuera para hacer c3
una expresión constante, y luego pliegue constante en donde se utiliza y no asignarlo. Para c4
, LTO podría arrojar el valor de c4
como una expresión constante, en cuyo caso también se puede plegar y eliminar constantemente.
en C++ 11 hay constexpr
funciones que permiten mucho más que hacer en esta región.
¿Qué pasó con 'c2'? –