Quando lo stesso codice viene compilato con ottimizzazioni completamente disabilitate (g++ -O0
) e poi di nuovo con le ottimizzazioni completamente abilitate (g++ -O3
), come è possibile modificare la logica del codice sorgente stesso?In che modo le ottimizzazioni del compilatore possono influire sulla logica del codice?
Per esempio, i compilatori possono
- unwind loops e
- fare constant folding.
Questi due ottimizzazioni rendono il codice eseguire più velocemente senza compromettere l'integrità del codice sorgente originale. Qualsiasi codice eseguito senza queste ottimizzazioni verrà eseguito con loro abilitato.
Tuttavia, le ottimizzazioni del compilatore possono influire anche sulla logica del codice. Ecco due esempi che conosco:
- Removing copy constructors and assignment operators da provvisori possono rimuovere possibili effetti collaterali.
- La risistemazione di valori aritmetici contenenti virgola mobile può influire sull'errore in virgola mobile (si spera che sia necessario l'argomento
-ffast-math
).
Sono stato molto sorpreso, e fortunato, a conoscere questi perché potrebbero diventare enormi potenziali trucchi nella situazione sbagliata.
Quindi voglio sapere, ci sono altri casi in cui le ottimizzazioni del compilatore C++ influenzeranno la logica del codice? Sono specificamente alla ricerca di informazioni su C++ 11 (senza alcun comportamento indefinito) sotto il compilatore g ++, ma i suggerimenti per altri compilatori sono i benvenuti.
Non dimenticare di menzionare che un comportamento indefinito significherà che qualsiasi cosa vada. – Mysticial
Credo che il compilatore possa anche 'non calcolare' cose che non verranno mai utilizzate in seguito. Anche se ciò non modifica la logica del tuo codice, potrebbe essere negativo se stai misurando le prestazioni. Non sono sicuro di questo però. – leo
@leo Buon punto! Anche se, mi aspetto sempre che la compilazione con le ottimizzazioni si comporti più velocemente, perché è il lavoro dell'ottimizzatore. – Ryan