iphone - que - Cómo lidiar con los problemas de optimización del compilador
que es optimización de código en c++ (3)
Tengo un problema molesto con mi aplicación de iPhone. Cada vez que configuro el nivel de optimización en algo que no sea "Ninguno", obtengo errores de cálculo. Esto solo ocurre cuando se construye para el iPhone SDK (el simulador de iPhone siempre está bien).
No me importaría deshabilitar las optimizaciones en el modo de lanzamiento, pero la aplicación es un poco demasiado lenta cuando lo hago.
La aplicación es compleja, por lo que es difícil localizar la parte que está optimizada de forma demasiado agresiva.
Creo que el problema está en el lado de GCC ya que parece tener problemas para optimizar el código de la arquitectura ARM.
¿Hay alguna forma de desactivar solo las optimizaciones solo para cierta parte del código? ¿Cómo lidiarías con ese tipo de problema?
Sí, eso es completamente posible. GCC tiene un atributo para eso:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize(0)));
void my_function(void) {
/* ... */
}
Establece el nivel de optimización para esa función en -O0
. Puede habilitar / deshabilitar optimizaciones específicas:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize("no-inline-functions")));
void my_function(void) {
/* ... */
}
Si la optimización cambia el comportamiento de su programa, es posible que involuntariamente dependa de un comportamiento indefinido o definido por la implementación. Podría valer la pena echar un vistazo más de cerca a su código con miras a suposiciones sobre los valores de las variables y las órdenes de evaluación.
Verifique que esté return
correctamente los valores de sus funciones. En mi experiencia, lo siguiente solo funciona a veces:
int myFunc()
{
x+7;
}
tenga en cuenta la omisión deliberada e insegura de la palabra clave return
debido a que el registro que se usa en el cálculo de expresión es el mismo que el registro de retorno.
Cuando las optimizaciones están activadas, registre los cambios de uso y la función no hará lo que usted desea.
Verifique las advertencias de su compilador.