Domanda

Sto riscontrando un fastidioso problema con la mia app per iPhone. Ogni volta che imposto il livello di ottimizzazione su qualcosa di diverso da "Nessuno", ottengo errori di calcolo. Questo succede solo quando si costruisce per l'SDK di iPhone (iPhone Simulator va sempre bene).

Non mi dispiacerebbe disabilitare le ottimizzazioni in modalità di rilascio, ma l'applicazione è un po 'troppo lenta quando lo faccio.

L'applicazione è complessa, quindi è difficile individuare la parte ottimizzata in modo troppo aggressivo.

Penso che il problema sia sul lato GCC poiché sembra che abbia problemi a ottimizzare il codice per l'architettura ARM.

Esiste un modo per disabilitare le ottimizzazioni solo per determinate parti del codice? Come gestiresti questo tipo di problema?

È stato utile?

Soluzione

Sì, è del tutto possibile. GCC ha un attributo per questo:

/* disable optimization for this function */
void my_function(void) __attribute__((optimize(0)));

void my_function(void) {
    /* ... */
}

Imposta il livello di ottimizzazione per quella funzione su -O0 . Puoi abilitare / disabilitare specifiche ottimizzazioni:

/* disable optimization for this function */
void my_function(void) __attribute__((optimize("no-inline-functions")));

void my_function(void) {
    /* ... */
}

Altri suggerimenti

Se l'ottimizzazione modifica il comportamento del tuo programma, potresti inconsapevolmente affidarti a comportamenti indefiniti o definiti dall'implementazione. Potrebbe valere la pena dare un'occhiata più da vicino al codice con un occhio alle ipotesi sui valori delle variabili e sugli ordini di valutazione.

Verifica che restituisca correttamente i valori delle tue funzioni. Nella mia esperienza, a volte funziona quanto segue:

int myFunc()
{
  x+7;
}

annota l'omissione deliberata e non sicura della parola chiave return

poiché il registro utilizzato nel calcolo dell'espressione è lo stesso del registro di ritorno.

Quando le ottimizzazioni sono attivate, registrati con le modifiche e la funzione non riesce a fare ciò che desideri.

Controlla gli avvisi del compilatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top