Agli inizi di gcc (2.8 ecc.) E ai tempi di egcs, e redhat 2.96 -O3 a volte era piuttosto difettoso. Ma questo è successo più di un decennio fa e -O3 non è molto diverso da altri livelli di ottimizzazione (in buggy).
Tende tuttavia a rivelare casi in cui le persone fanno affidamento su comportamenti indefiniti, a causa del fatto di affidarsi più strettamente alle regole, e in particolare ai casi angolari, delle lingue.
Come nota personale, sto eseguendo software di produzione nel settore finanziario da molti anni ormai con -O3 e non ho ancora riscontrato un bug che non sarebbe stato lì se avessi usato -O2.
A grande richiesta, ecco un'aggiunta:
-O3 e in particolare flag aggiuntivi come -funroll-loops (non abilitato da -O3) a volte possono generare più codice macchina. In determinate circostanze (ad es. Su una CPU con cache di istruzioni L1 eccezionalmente piccola), ciò può causare un rallentamento a causa di tutto il codice, ad esempio di un ciclo interno, che ora non si adatta più a L1I. Generalmente gcc si impegna piuttosto a non generare così tanto codice, ma poiché di solito ottimizza il caso generico, ciò può accadere. Le opzioni particolarmente inclini a questo (come lo srotolamento del loop) normalmente non sono incluse in -O3 e sono contrassegnate di conseguenza nella manpage. Come tale, è generalmente una buona idea usare -O3 per generare codice veloce e ricorrere a -O2 o -Os (che tenta di ottimizzare la dimensione del codice) quando appropriato (ad es. Quando un profiler indica errori L1I).
Se vuoi portare l'ottimizzazione all'estremo, puoi modificare in gcc tramite --param i costi associati a determinate ottimizzazioni. Inoltre nota che gcc ora ha la capacità di mettere attributi su funzioni che controllano le impostazioni di ottimizzazione solo per queste funzioni, quindi quando trovi che hai un problema con -O3 in una funzione (o vuoi provare flag speciali solo per quella funzione), non è necessario compilare l'intero file o l'intero progetto con O2.
sembra che si debba fare attenzione quando si usa -Ofast, che afferma:
-Ofast abilita tutte le ottimizzazioni -O3. Consente inoltre ottimizzazioni non valide per tutti i programmi conformi standard.
il che mi porta a concludere che -O3 deve essere completamente conforme agli standard.