Los compiladores C/C++ optimizan las funciones de capa única con parámetros constantes (conocidas en tiempo de compilación) solo cuando se usan -Os, -O1 y -O2. No optimizan todas las capas. Solo -O3 puede hacer eso. gcc es WinAVR 4.3.3 que no admite el atributo "optimizar".c/C++ optimizar para variable constante en las funciones de llamada
void inner(double value)
{
//operations using value
//...
}
void outer(double value)
{
//few operations using value
//...
inner(value);
}
int main()
{
inner(1); //optimize
outer(1); //only optimize by using -O3
}
¿Cuáles son las posibles soluciones aparte de las siguientes?
- -O3 programa de retención o archivo (mal uso va a explotar el tamaño)
- atribuyen optimizar -O3 para las funciones (4.3.3 no soporta)
- macro (propenso a errores)
actualización:
//inner function
static inline void _delay_us(double __us) __attribute__((always_inline));
//outer function
void f(double);
inline f1(double);
static inline f2(double);
static f3(double);
f1 está optimizado b ut give warning '_delay_us' es estático pero se usa en la función en línea 'f1' que no es estática debido al problema de la función estática. Otros no están optimizados.
Solución:
static inline void outer(double) __attribute__((always_inline));
en línea es la clave. Mi función externa es demasiado grande para en línea. El atributo always_inline obliga a la función a estar en línea. Esto permite que el compilador optimice la función con un costo de compilación menor que tratando de descubrir la optimización. -O3 es lo suficientemente inteligente como para hacer la optimización pero no -Os. -Es posible que necesite algunas opciones de compilación. (La palabra clave estática es necesaria porque la función interna también está estática en línea.)
Hm, no estoy seguro de entender por qué esto es una preocupación. Si quieres que el compilador optimice, díselo. Si teme que '-O3' (o cualquier nivel) explote el tamaño del código,' -Os' es el camino a seguir. –
El código se usa en microcontroladores de 8 bits que no tienen hardware de coma flotante ALU. -O3 de hecho da un tamaño de código más pequeño que -Os en esta función, 4k vs 400 – keithyip