web-dev-qa-db-fra.com

Quelle est la différence entre les options du compilateur / Ox et / O2?

Compilateur C++ de Microsoft (cl.exe, comme inclus dans Visual Studio) offre plusieurs commutateurs d'optimisation . La différence entre la plupart d'entre eux semble s'expliquer d'elle-même, mais je ne vois pas clairement quelle est la différence entre /O2 (qui optimise le code pour la vitesse maximale) et /Ox (qui sélectionne "optimisation complète").

J'ai essayé de lire le documentation pour le /Ox option, et il semble confirmer que ce commutateur permet également des optimisations pour la vitesse maximale, plutôt que la taille:

Le /Ox L'option du compilateur produit du code qui favorise la vitesse d'exécution par rapport à une taille plus petite.

Mais en particulier, la déclaration suivante sous la section "Remarques" a attiré mon attention:

En général, spécifiez /O2 (Maximiser la vitesse) au lieu de /Ox.

Donc ma question est, pourquoi devrait-on généralement favoriser /O2 plus de /Ox? Cette dernière option permet-elle une optimisation particulière connue pour provoquer des bogues imprévus ou un comportement inattendu? Est-ce simplement que la quantité d'optimisation à gagner ne vaut pas le temps de compilation supplémentaire? Ou s'agit-il simplement d'une "recommandation" totalement dénuée de sens résultant du fait que /O2 est l'option par défaut dans VS?

63
Cody Gray

réponse d'Asha cite un article de blog sur Visual Studio 2005 et est plutôt obsolète.

La dernière version de la documentation est disponible ici:

Selon ceux-ci:

Vous pouvez également être intéressé par /GS- qui désactive les contrôles de sécurité autour de la pile, ce qui peut être un impact significatif sur les performances (voir MS docs for/GS ).

Vous devriez toujours comparer votre application spécifique.

43
Alastair Maw

Je l'ai trouvé ici :

Ox et O2 sont presque identiques. Ils ne diffèrent que par le fait que O2 jette également GF et Gy . Il n'y a presque aucune raison d'éviter de lancer ces deux commutateurs.

48
Asha