Pregunta

Tengo un problema molesto con mi aplicación de iPhone. Cada vez que configuro el nivel de optimización en algo distinto de "Ninguno", obtengo errores de cálculo. Esto solo ocurre cuando se compila para el SDK de iPhone (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 lenta cuando hago eso.

La aplicación es compleja, por lo que es difícil localizar la parte que está demasiado agresivamente optimizada.

Creo que el problema está en el lado de GCC ya que parece tener problemas para optimizar el código para la arquitectura ARM.

¿Hay alguna manera de deshabilitar las optimizaciones solo para cierta parte del código? ¿Cómo lidiarías con ese tipo de problema?

¿Fue útil?

Solución

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) {
    /* ... */
}

Otros consejos

Si la optimización cambia el comportamiento de su programa, puede estar confiando involuntariamente en 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 los supuestos sobre los valores de las variables y los órdenes de evaluación.

Compruebe que está return correctamente los valores de sus funciones. En mi experiencia, lo siguiente solo a veces funciona:

int myFunc()
{
  x+7;
}

tenga en cuenta la omisión deliberada e insegura de la palabra clave de retorno

debido a que el registro que se usa en el cálculo de la 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 puede hacer lo que desea.

Verifique las advertencias de su compilador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top